ポリシーとGateによるアクセス制御

Laravelの「ポリシー(Policy)」および「Gate」は、**認可(Authorization)**を実装するための仕組みであり、ユーザーが特定のアクションを実行できるかどうかを柔軟に制御することができます。以下に、両者の特徴と使い方について詳しく説明します。


1. 認可の概要

Laravelにおける認可は、ユーザーが「何を実行できるか」を決定するロジックです。例えば、「投稿の編集は作成者だけができる」といったルールを実装する際に使用されます。

Laravelでは、認可のために主に次の2つの方法が提供されています:

  • Gate(ゲート):汎用的な認可ロジックを定義するための手法

  • Policy(ポリシー):特定のモデルに対するアクションを定義するためのクラスベースの方法


2. Gateによるアクセス制御

2-1. Gateの定義

Gate::define()メソッドで定義します。通常は AuthServiceProviderboot() メソッド内で記述します。

php
use Illuminate\Support\Facades\Gate; public function boot() { Gate::define('edit-post', function ($user, $post) { return $user->id === $post->user_id; }); }

この例では、投稿の編集が投稿の所有者にのみ許可されます。

2-2. Gateの使用例

php
if (Gate::allows('edit-post', $post)) { // ユーザーはこの投稿を編集できる }

または、Bladeテンプレート内では以下のように記述できます:

blade
@can('edit-post', $post) <a href="/posts/{{ $post->id }}/edit">編集</a> @endcan

3. Policyによるアクセス制御

3-1. Policyの作成

以下のArtisanコマンドでポリシークラスを生成できます:

bash
php artisan make:policy PostPolicy --model=Post

このコマンドにより、app/Policies/PostPolicy.php が作成され、Postモデルに対応するアクションが定義されたテンプレートが自動生成されます。

3-2. Policyの登録

AuthServiceProvider にてポリシーとモデルの関連付けを行います。

php
protected $policies = [ App\Models\Post::class => App\Policies\PostPolicy::class, ];

3-3. Policy内のメソッド定義

php
public function update(User $user, Post $post) { return $user->id === $post->user_id; }

この update() メソッドは、Postの編集権限を定義しています。

3-4. Policyの使用例

コントローラ内:

php
$this->authorize('update', $post);

Bladeテンプレート内:

blade
@can('update', $post) <a href="/posts/{{ $post->id }}/edit">編集</a> @endcan

4. GateとPolicyの使い分け

項目 Gate Policy
用途 単発のロジック モデルごとの認可ルール
実装形式 クロージャ関数 クラスとメソッド
対象 汎用的 モデル単位

一般的には、特定のモデルに紐づく認可はPolicyで実装し、単発的なロジックや複数モデルに関わる認可にはGateを使用するのが推奨されます。


5. その他のポイント

  • @can, @cannot, Gate::allows, Gate::denies などの補助メソッドを活用することで、コントローラやビューで認可チェックが簡潔に書けます。

  • ポリシーには before() メソッドを定義することで、すべてのアクションに先立って特定ユーザー(例:管理者)を許可することも可能です。

php
public function before(User $user, $ability) { if ($user->is_admin) { return true; } }

まとめ

Laravelにおける「ポリシーとGateによるアクセス制御」は、ユーザーの権限に基づいた処理制御を実現するための堅牢な仕組みです。認証が「誰かを特定する」機能であるのに対し、認可は「その人に何が許されているかを判断する」機能であり、GateとPolicyを適切に使い分けることで、セキュアで明確なアクセス制御を実現できます。

ChatGPT4o 生成日:2025/06/23