Laravelのリソースベース認可を完全入門!authorizeResourceで楽にアクセス制御しよう
生徒
「LaravelでPolicyは使えるようになったんですが、毎回authorizeを書くのが大変です」
先生
「それなら、リソースベースの認可であるauthorizeResourceを使うと便利ですよ」
生徒
「authorizeResourceって何をしてくれるんですか?」
先生
「コントローラの処理ごとに、Policyを自動で呼び出してくれる仕組みです」
1. リソースベースの認可とは?
Laravelのリソースベースの認可とは、投稿や商品などの1つのデータのまとまりを基準にして、アクセス制御を行う方法です。Laravelでは、これを簡単に設定できる仕組みとしてauthorizeResourceが用意されています。
たとえば「投稿を見る」「投稿を作る」「投稿を編集する」といった操作は、すべて投稿という同じ対象に対する行動です。このような場合、毎回認可処理を書くよりも、まとめて自動化したほうが安全で分かりやすくなります。
2. authorizeResourceが必要になる理由
通常のPolicy利用では、コントローラの中でauthorizeを何度も書く必要があります。処理が増えるほど、書き忘れやミスが起こりやすくなります。
authorizeResourceを使うと、Laravelがどの処理で、どのPolicyメソッドを使うかを自動で判断してくれます。これは、学校で言えば「授業ごとの細かい確認を、時間割表で一括管理する」ようなイメージです。
3. リソースコントローラとの関係
authorizeResourceは、リソースコントローラと一緒に使います。リソースコントローラとは、一覧表示、作成、編集、削除など、決まった名前のメソッドを持つコントローラです。
Laravelでは、この決まったメソッド名とPolicyのメソッド名が対応しています。そのため、自動で認可処理が行えるようになっています。
4. Policyクラスを準備しよう
まずは、対象となるモデル用のPolicyクラスが必要です。ここでは投稿を例にします。
php artisan make:policy PostPolicy --model=Post
このPolicyクラスには、view、create、update、deleteなどのメソッドが用意されます。これらが、リソースコントローラの各処理と結びつきます。
5. Policyメソッドの基本例
たとえば、投稿を編集できるかどうかを判断する場合、次のように書きます。
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
これは「ログインしている人が、その投稿の作成者なら編集できる」という意味です。難しく見えても、比べているだけのシンプルな条件です。
6. authorizeResourceをコントローラに設定する
次に、コントローラでauthorizeResourceを設定します。これは、コンストラクタという特別な場所に書きます。
public function __construct()
{
$this->authorizeResource(Post::class, 'post');
}
これだけで、index、show、create、store、edit、update、destroyといった処理に対して、対応するPolicyメソッドが自動で呼ばれます。
7. 自動で行われる認可の仕組み
authorizeResourceを設定すると、Laravelは次のように動きます。
- editメソッド → updateポリシー
- destroyメソッド → deleteポリシー
- createメソッド → createポリシー
この対応関係を覚える必要はありません。Laravelが内部で処理してくれるため、開発者はPolicyの中身に集中できます。
8. Bladeテンプレートとの相性
authorizeResourceを使っていても、Bladeテンプレートでは@canがそのまま使えます。画面表示と処理の両方で、同じルールが使われるため、ズレが起きにくくなります。
@can('update', $post)
<button>編集</button>
@endcan
これにより、操作できない人にはボタン自体が表示されません。ユーザーにとっても安心できる画面になります。
9. authorizeResourceを使うメリット
authorizeResourceの最大のメリットは、書くコードが減り、ミスも減ることです。認可処理を忘れてしまうと、誰でも操作できる危険な画面ができてしまいます。
Laravel標準の仕組みを使うことで、初心者でも安全なアプリケーションを作りやすくなります。特に、投稿管理やユーザー管理などでは大きな効果があります。