マルチ認証化【管理権限の階層化】
認証システムに階層を作りそれぞれに権限を持たせるマルチ認証化にします。
userテーブルに直接roleカラムを追加し、ゲート機能を利用します。
まずはusersテーブルにロールカラムを追加するマイグレーションを作成。
php artisan make:migration add_role_to_userstable
マイグレーションの記述。
class AddRoleToUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table(‘users’, function (Blueprint $table) {
$table->tinyInteger(‘role’)
->default(0)
->after(‘password’)
->index(‘index_role’)
->comment(‘ロール’);
});
}/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table(‘users’, function (Blueprint $table) {
$table->dropColumn(‘role’);
});
}
}
マイグレーションする。
php artisan migrate
ロールの設定は
0->一般ログインユーザ(user)
1->特定権限ユーザ(admin)
2->システム管理者(superadmin)
とする。
ゲート機能を使ってユーザを切り分ける準備。
app/Http/Providers/AuthServiceProvider.phpを書き換え。
public function boot()
{
$this->registerPolicies();
// 開発者のみ許可
Gate::define(‘superadmin’, function ($user) {
return ($user->role == 2);
});
// 管理者以上(管理者&システム管理者)に許可
Gate::define(‘admin’, function ($user) {
return ($user->role >= 1);
});
// 一般ユーザ以上(つまり全権限)に許可
Gate::define(‘user’, function ($user) {
return ($user->role == 0);
});
}
ruteの記述で各ルートを権限で切り分けます。
// 全ユーザ
Route::group(['middleware' => ['auth', 'can:user']], function () {
// ユーザ一覧
Route::get('/account', 'AccountController@index')->name('account.index');
});
// 管理者以上
Route::group(['middleware' => ['auth', 'can:admin']], function () {
// ユーザ登録
Route::get('/account/regist', 'AccountController@regist')->name('account.regist');
Route::post('/account/regist', 'AccountController@createData')->name('account.regist');
// ユーザ編集
Route::get('/account/edit/{user_id}', 'AccountController@edit')->name('account.edit');
Route::post('/account/edit/{user_id}', 'AccountController@updateData')->name('account.edit');
// ユーザ削除
Route::post('/account/delete/{user_id}', 'AccountController@deleteData');
});
// システム管理者のみ
Route::group(['middleware' => ['auth', 'can:superadmin']], function () {
});
viewでの切り分けは以下の通り。
@can(‘superadmin’)
システム管理者のみに表示する内容
@endcan@can(‘admin’)
特定権限管理者のみに表示する内容
@endcan
コントローラーでのアクションの切り分け。
コントローラークラスでコンストラクターに以下を記述。
ログインユーザのみ表示するとともにロールが引っ張ってこれる。
public function __construct()
{
//ログインユーザのみ表示
$this->middleware(‘auth’);
}
ロールによって戻り先を変えるときなどは以下のように条件分岐できる。
if(\Auth::user()->role == 2){
return redirect()->route(‘hoge.show’, [$id]);
}elseif(\Auth::user()->role == 1){
return redirect()->route(‘fuga.show’, [$id]);
}else{
dd(\Auth::user()->role);
}
参考ページ
https://www.ritolab.com/entry/56
https://qiita.com/zaburo/items/2ebc725e29657206d7d9
https://codechord.com/2018/12/laravel_auth_gate_policy/
