Skip to main content

認証と認可の違い

認証(Authentication) はユーザーが「誰であるか」を確認します。ログイン処理がその代表です。 認可(Authorization) はそのユーザーが「何をできるか」を判断します。たとえば、自分の投稿だけを編集できる、管理者だけが設定を変更できる、といった制御です。 認証でログイン機能を実装したら、次のステップが認可です。
Laravelの認可機能は、ゲート(Gates)とポリシー(Policies)の2つのアプローチを提供します。どちらを使うかはユースケースによって判断します。
使い分けの基準

ゲート(Gates)

ゲートはクロージャベースのシンプルな認可チェックです。特定のモデルに紐づかない権限判定に向いています。

Gateによる認可フロー

ゲートを定義する

ゲートは App\Providers\AppServiceProviderboot メソッド内で Gate::define() を使って定義します。
ゲートのクロージャは常に第1引数で現在認証中のユーザーを受け取ります。第2引数以降に対象のモデルなど追加情報を渡せます。

ゲートで権限を確認する

コントローラーでゲートを使って権限を確認するには Gate::allows() または Gate::denies() を使います。

Gate::authorize() で例外を投げる

権限がない場合に自動で403レスポンスを返すには Gate::authorize() を使います。abort(403) を書く手間が省けます。
Gate::authorize() は権限がない場合に Illuminate\Auth\Access\AuthorizationException を投げます。Laravelはこれを自動的に403 HTTPレスポンスに変換します。

管理者バイパス(before メソッド)

管理者ユーザーにすべての権限を与えたい場合は Gate::before() を使います。
before のクロージャが null 以外の値を返すと、その結果が最終的な権限判定になります。null を返すか何も返さない場合は、通常のゲート判定に進みます。

Bladeテンプレートでの @can / @cannot

テンプレートでゲート判定を使うには @can@cannot ディレクティブが便利です。

ポリシー(Policies)

ポリシーは特定のモデルに関連する認可ロジックをクラスにまとめたものです。Post モデルに対する作成・閲覧・編集・削除の権限管理には、ゲートよりもポリシーが適しています。

Policyによる認可フロー

ポリシーを生成する

make:policy Artisanコマンドでポリシークラスを生成します。
モデルに対応するCRUDメソッドをすべて含むひな型を生成するには --model オプションを使います。
app/Policies/PostPolicy.php が生成されます。

モデルとポリシーの自動検出

Laravelはデフォルトで命名規則に従ってポリシーを自動的に検出します。
  • モデル: app/Models/Post.php
  • ポリシー: app/Policies/PostPolicy.php
この命名規則を守れば、ポリシーの登録作業は不要です。
命名規則に従わない場合や手動で登録したい場合は、AppServiceProviderboot メソッドで Gate::policy() を使います。
Laravel 13では、モデルに #[UsePolicy] アトリビュートを付けて宣言的に登録することもできます。

ポリシーメソッドを実装する

--model オプションで生成したポリシーには、標準的なCRUDアクションに対応するメソッドが含まれています。

管理者バイパス(before メソッド)

ポリシーでも before メソッドを定義することで、管理者にすべての権限を与えられます。
before メソッドはポリシークラスに対応するメソッドが存在する場合にのみ呼び出されます。たとえば update メソッドが存在しない場合、before も呼び出されません。

before コールバックの実行順序

コントローラーでポリシーを使う

authorize() メソッド

Laravelのコントローラーには authorize() ヘルパーメソッドがあります(ベースコントローラーを使わない場合は Gate::authorize() を使います)。

authorizeResource() でRESTfulポリシーを一括登録

authorizeResource() をコンストラクターで呼ぶと、コントローラーの各アクションに対応するポリシーメソッドを自動的に紐付けます。
コントローラーアクションとポリシーメソッドの対応関係:
authorizeResource() を使うと、各アクションに個別で authorize() を書く必要がなくなります。RESTfulなリソースコントローラーと組み合わせると特に便利です。

ミドルウェアでの認可

ルートレベルで認可チェックを行うには can ミドルウェアを使います。
can メソッドを使ったより簡潔な記述:

Bladeテンプレートでポリシーを使う

ポリシーを登録すると、Bladeの @can / @cannot ディレクティブでもポリシーが自動的に使われます。

実践例: ブログ記事の権限管理

ブログアプリで「投稿者だけが自分の記事を編集・削除できる」権限を実装する例です。
1

ポリシーを生成する

2

ポリシーメソッドを実装する

3

コントローラーに authorizeResource() を追加する

4

Bladeテンプレートに権限チェックを追加する

まとめ

  • ゲート: 特定のモデルに紐づかないシンプルな権限判定。管理者ダッシュボードへのアクセスや、グローバルな設定の変更権限など。
  • ポリシー: モデルに対するCRUD操作の権限管理。PostOrderComment といったリソースごとにポリシークラスを作成する。
最終更新日 2026年4月11日