0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Laravel】Gateでロール毎に権限を分ける

Posted at

ユーザーの権限を複数作成して、アクセスできるページや表示内容を権限毎に変えたい事はよくあると思います。
それを簡単に実装できる機能がLaravelにあり、使ってみたらとても便利だったので、メモしておきます。

前提条件

  • 権限を2つ以上用意したい(今回は「管理者」と「一般」)
  • ログインで使用するユーザーテーブル(usersとする)は下記の通り
id
username
email
password
role // 管理者:100 / 一般:1
remember_token
created_at
updated_at

権限を設定する

app/Providers/AuthServiceProvider.php
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のユーザーを管理者として設定しました。

アクセス制限

管理者しかアクセスできない画面を作ります。

routes/web.php
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 認可

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?