ユーザーの権限を複数作成して、アクセスできるページや表示内容を権限毎に変えたい事はよくあると思います。
それを簡単に実装できる機能がLaravelにあり、使ってみたらとても便利だったので、メモしておきます。
前提条件
- 権限を2つ以上用意したい(今回は「管理者」と「一般」)
- ログインで使用するユーザーテーブル(usersとする)は下記の通り
id
username
email
password
role // 管理者:100 / 一般:1
remember_token
created_at
updated_at
権限を設定する
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
// 管理者のみ
Gate::define('admin_only', function ($user) {
return ($user->role_id === 100);
});
}
$user
には
'admin_only'
には、ロールの名前を指定し、functionの中で条件を設定します。
今回は、usersテーブルのroleカラムが100のユーザーを管理者として設定しました。
アクセス制限
管理者しかアクセスできない画面を作ります。
Route::group(['middleware' => ['auth', 'can:admin_only']], function () {
Route::get('account', 'AccountController@index')->name('account.index');
});
can:
で、AuthServiceProvider.phpに設定したロール名を指定し、function内にRouteを設定します。
こうすると、users.roleが100ではないユーザーがこの画面にアクセスしたとき、403エラーとなりエラー画面が表示されるようになります。
権限による表示内容の出し分け
管理者だけに表示したいHTMLがあるとき、下記のように設定します。
@can ('admin_only')
<span>管理者にだけ表示させる</span>
@endcan
複数権限があって、それぞれ出し分けたいときは@elsecan('ロール名')
を使えば良いです。
逆に特定の権限にだけ表示したくないときは@cannot
権限がたくさんあり、いくつかの権限に表示したいときは@canany(['role1', 'role2', 'role3'])
のように配列にして渡すこともできます。
他にも便利な機能がたくさんあるので、是非↓の参考URLもご覧ください。
参考URL:公式 Laravel 6.x 認可