LaravelのPolicyクラス完全入門!初心者でもわかるアクセス制御の基本
生徒
「Laravelでログインはできたんですが、人によって見せていい画面とダメな画面を分けたいです」
先生
「それなら、LaravelのPolicyクラスを使うと整理して管理できます」
生徒
「Policyって何ですか?難しそうに聞こえます…」
先生
「ルールブックのようなものです。誰が何をしてよいかを、まとめて書ける仕組みですよ」
1. Policyクラスとは?
LaravelのPolicyクラスとは、「この人はこの操作をしてもよいか?」という判断をまとめて書くための仕組みです。これを認可と呼びます。認可とは、ログインしている人が行動してよいかどうかを決めることです。
たとえば、学校をイメージしてください。先生は成績表を編集できますが、生徒は見るだけです。この「誰が何をできるか」という決まりを、LaravelではPolicyクラスに書きます。
2. 認証と認可の違いを知ろう
Laravelの学習では、認証と認可の違いを理解することがとても大切です。
- 認証:あなたは誰ですか?(ログインしているか)
- 認可:あなたは何をしていいですか?
Policyクラスは、このうち認可を担当します。ログイン後の行動を安全に制御するために使われます。
3. Policyクラスを作成する流れ
Policyクラスは、Laravelのコマンドを使って簡単に作成できます。ここでは「投稿(Post)」を編集できるかどうかを判断する例で説明します。
php artisan make:policy PostPolicy --model=Post
このコマンドを実行すると、app/PoliciesフォルダにPolicyクラスが作成されます。Policyは「このモデルに対するルールを書く場所」と覚えてください。
4. Policyクラスの中身を見てみよう
作成されたPolicyクラスには、いくつかのメソッドがあります。ここでは、編集できるかどうかを判断するupdateメソッドを使います。
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
これは「ログインしている人のID」と「投稿を作った人のID」が同じなら、編集してよい、という意味です。つまり自分が作った投稿だけ編集できるというルールになります。
5. コントローラでPolicyを使う方法
次に、このPolicyを実際の処理で使います。コントローラでauthorizeメソッドを呼び出します。
public function edit(Post $post)
{
$this->authorize('update', $post);
return view('posts.edit', compact('post'));
}
この1行がとても重要です。もし編集してはいけない人がアクセスすると、Laravelが自動でエラーを出して処理を止めてくれます。
6. BladeテンプレートでのPolicy利用
画面側でもPolicyを使って、「編集ボタンを表示するかどうか」を制御できます。
@can('update', $post)
<a href="/posts/{{ $post->id }}/edit">編集</a>
@endcan
これにより、権限がない人には最初からボタンが表示されません。ユーザーにとっても分かりやすく、安全な画面になります。
7. Policyを使うメリット
Policyクラスを使うと、アクセス制御のルールを1か所にまとめられます。if文をあちこちに書かなくて済むため、コードが読みやすくなり、間違いも減ります。
また、Laravel標準の仕組みなので、将来機能が増えても管理しやすいのが特徴です。初心者のうちからPolicyに慣れておくと、実務でも役立ちます。