【Laravel】ゲートを使ってみたよ〜


はじめに

今回は実務で実装していて
ゲートを使って特定のユーザーに対してアクセスを制限させることを
まとめていきます。
ゲートを使わずに実装しようとしたら
10箇所ほどに条件分岐を加えないといけなかったけど
それが一手間で済むのでぜひとも参考にしてみてください!

認可とは?

そもそも認可ってなんでしょう?

認可(英: authorization)とは、一般的には情報セキュリティおよびコンピュータセキュリティに関わるリソースへの、とりわけアクセス制御へのアクセス権限を特定する機能である。よりフォーマルにいえば、「認可する (to authorize)」とは、アクセスポリシーを定義することである。例えば、人事部門のスタッフは従業員の記録にアクセスする権限を与えられており、このポリシーはコンピュータシステム内のアクセス制御規則として定式化されているのが普通である。システムはそのアクセス制御規則を使って、(認証された)利用者のアクセス要求を受け入れるか拒否するかを決定する。リソースには、個々のファイルやアイテムのデータ、プログラム、コンピュータハードウェア、コンピュータアプリケーションが提供する機能が含まれる。利用者とは例えば、コンピュータユーザー、プログラム、コンピュータ上のその他の機器を指す。
引用元: フリー百科事典『ウィキペディア(Wikipedia)』

ん〜何が言いたいんだw
単純にまとめると
【誰が誰に何の権限を与えるか】
こちらが認可の意味合いになります。

あとから実装していきますが
今回は管理者とユーザーがいて
管理者はどのURLにもアクセスできるけど
ユーザーにはアクセスできるURLに制限をかける
これが今回やりたかった認可になります。

いざ実装!

// App\Models\User
public const ADMIN = 1;
public const USER = 2;

上記のようにUserにはroleを設定していて
それを使って認可していきます。

App\Providers\AuthServiceProviderクラスのbootメソッドに定義をする

public function boot()
{
    $this->registerPolicies();

    Gate::define('admin', function (User $user) {
        return ($user->role == User::ADMIN);
    });
}

今回はシンプルに権限(role)がUser::ADMINと同じだったら認可がおりるようにした。
次にroutes/web.php

Route::middleware('auth', 'can:admin')->group(function() {
    // 管理者が使用するrouteを定義
});

なんとこれだけで管理者以外はアクセスすることが認可されないrouteを定義することが
出来ちゃいます!
ここで注意が必要なのが上記のコードで管理者以外が管理者しかアクセスできないrouteに
アクセスすると403が返ってくるのですがLaravelには403ページが用意されてないので
個別で403ページを作成する必要があります!

まとめ

今回はゲートについてまとめてみました。
ゲートを知らなかったら各ルートに対して条件分岐を書いて
遅くまで残業するところでしたw助かった。

最後まで読んでいただきありがとうございます。
ついでにLGTMをポチッとお願いします。また、誤りや別の良いやり方などありましたら
コメントにて頂けると嬉しいです。