認証と認可の違い
認証(Authentication) はユーザーが「誰であるか」を確認します。ログイン処理がその代表です。 認可(Authorization) はそのユーザーが「何をできるか」を判断します。たとえば、自分の投稿だけを編集できる、管理者だけが設定を変更できる、といった制御です。 認証でログイン機能を実装したら、次のステップが認可です。Laravelの認可機能は、ゲート(Gates)とポリシー(Policies)の2つのアプローチを提供します。どちらを使うかはユースケースによって判断します。
ゲート(Gates)
ゲートはクロージャベースのシンプルな認可チェックです。特定のモデルに紐づかない権限判定に向いています。Gateによる認可フロー
ゲートを定義する
ゲートはApp\Providers\AppServiceProvider の boot メソッド内で Gate::define() を使って定義します。
ゲートで権限を確認する
コントローラーでゲートを使って権限を確認するにはGate::allows() または Gate::denies() を使います。
Gate::authorize() で例外を投げる
権限がない場合に自動で403レスポンスを返すにはGate::authorize() を使います。abort(403) を書く手間が省けます。
管理者バイパス(before メソッド)
管理者ユーザーにすべての権限を与えたい場合はGate::before() を使います。
before のクロージャが null 以外の値を返すと、その結果が最終的な権限判定になります。null を返すか何も返さない場合は、通常のゲート判定に進みます。
Bladeテンプレートでの @can / @cannot
テンプレートでゲート判定を使うには@can と @cannot ディレクティブが便利です。
ポリシー(Policies)
ポリシーは特定のモデルに関連する認可ロジックをクラスにまとめたものです。Post モデルに対する作成・閲覧・編集・削除の権限管理には、ゲートよりもポリシーが適しています。
Policyによる認可フロー
ポリシーを生成する
make:policy Artisanコマンドでポリシークラスを生成します。
--model オプションを使います。
app/Policies/PostPolicy.php が生成されます。
モデルとポリシーの自動検出
Laravelはデフォルトで命名規則に従ってポリシーを自動的に検出します。- モデル:
app/Models/Post.php - ポリシー:
app/Policies/PostPolicy.php
命名規則に従わない場合や手動で登録したい場合は、Laravel 13では、モデルに
AppServiceProvider の boot メソッドで Gate::policy() を使います。#[UsePolicy] アトリビュートを付けて宣言的に登録することもできます。ポリシーメソッドを実装する
--model オプションで生成したポリシーには、標準的なCRUDアクションに対応するメソッドが含まれています。
管理者バイパス(before メソッド)
ポリシーでもbefore メソッドを定義することで、管理者にすべての権限を与えられます。
before コールバックの実行順序
コントローラーでポリシーを使う
authorize() メソッド
Laravelのコントローラーにはauthorize() ヘルパーメソッドがあります(ベースコントローラーを使わない場合は Gate::authorize() を使います)。
- User::can() / cannot()
authorizeResource() でRESTfulポリシーを一括登録
authorizeResource() をコンストラクターで呼ぶと、コントローラーの各アクションに対応するポリシーメソッドを自動的に紐付けます。
ミドルウェアでの認可
ルートレベルで認可チェックを行うにはcan ミドルウェアを使います。
can メソッドを使ったより簡潔な記述:
Bladeテンプレートでポリシーを使う
ポリシーを登録すると、Bladeの@can / @cannot ディレクティブでもポリシーが自動的に使われます。
実践例: ブログ記事の権限管理
ブログアプリで「投稿者だけが自分の記事を編集・削除できる」権限を実装する例です。1
ポリシーを生成する
2
ポリシーメソッドを実装する
3
コントローラーに authorizeResource() を追加する
4
Bladeテンプレートに権限チェックを追加する
まとめ
ゲートとポリシーの使い分け
ゲートとポリシーの使い分け
- ゲート: 特定のモデルに紐づかないシンプルな権限判定。管理者ダッシュボードへのアクセスや、グローバルな設定の変更権限など。
- ポリシー: モデルに対するCRUD操作の権限管理。
Post、Order、Commentといったリソースごとにポリシークラスを作成する。
よく使うAPIまとめ
よく使うAPIまとめ
よく使うArtisanコマンド
よく使うArtisanコマンド