いずみこんな悩みを解決できる記事を書きました!
僕は現役フリーランスエンジニア(歴10年)で、資格は13個保有しています。
「LaravelでPolicyを使った認可の実装方法を知りたい」とお考えではありませんか?
Laravelで特定のユーザーだけが投稿を編集・削除できるようにしたい場面は多くあります。
Policyを使うと、モデルごとの認可ロジックをコントローラーから切り離してすっきり管理できます。



認可ロジックがコントローラーに散らばっていると、後から見返すのが大変になります。
ということで、本記事ではLaravelでPolicyを使った認可を実装する方法を解説します。
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
Policyで認可を実装する方法
早速ですが、LaravelでPolicyを使った認可の実装方法を解説します。
Policyとは
Policyは、特定のモデルに対する操作を許可するかどうかを判定するクラスです。
例えば投稿の編集や削除を、投稿の作成者本人だけに許可するといったロジックをPolicyにまとめられます。
コントローラーやBladeテンプレートに認可ロジックを直接書かずに済むため、コードの見通しが良くなります。
Policyを作成する
PostPolicyクラスを作成し、投稿の編集・削除を制御してみます。
PostPolicyクラスを、artisanコマンドで生成します。
php artisan make:policy PostPolicy --model=Postapp/Policiesディレクトリに、PostPolicyクラスが作成されます。
生成されたPostPolicyクラスに、updateメソッドとdeleteメソッドを実装します。
<?php
namespace App\Policies;
use App\Models\Post;
use App\Models\User;
class PostPolicy
{
public function update(User $user, Post $post): bool
{
return $user->id === $post->user_id;
}
public function delete(User $user, Post $post): bool
{
return $user->id === $post->user_id;
}
}投稿を作成したユーザーのIDと、操作しようとしているユーザーのIDが一致する場合のみtrueを返します。
PostPolicyという名前のクラスをapp/Policiesに置き、対応するPostモデルをapp/Modelsに置いておけば、Laravelが自動的にPolicyを認識します。
命名規則から外れる場合は、AppServiceProviderのbootメソッドでGate::policyメソッドを使い、モデルとPolicyを手動で紐付けます。
use App\Models\Post;
use App\Policies\PostPolicy;
use Illuminate\Support\Facades\Gate;
public function boot(): void
{
Gate::policy(Post::class, PostPolicy::class);
}


命名規則さえ守れば、Policyの登録作業自体が不要になります。
ファイル名とクラス名を揃えておくだけで、Laravel側が自動的に見つけてくれます。
コントローラーでPolicyを使う
作成したPostPolicyを、コントローラーから呼び出します。
PostControllerのupdateアクションで、authorizeメソッドを呼び出します。
public function update(Request $request, Post $post)
{
$this->authorize('update', $post);
$post->update($request->validated());
return redirect()->route('posts.show', $post);
}PostPolicyのupdateメソッドがfalseを返した場合、AuthorizationException例外が発生し、403エラーが返されます。
編集ボタンなどの表示を、Bladeテンプレート側でも制御できます。
@can('update', $post)
<a href="{{ route('posts.edit', $post) }}">編集する</a>
@endcancanディレクティブに渡した認可が通らない場合、編集リンク自体が表示されません。



コントローラーとBladeの両方でチェックしておくと、URLを直接叩かれた場合の対策にもなります。
GateとPolicyの使い分け
Gateは、モデルに紐付かないシンプルな認可ロジックを書く場合に向いています。
特定のモデルに対する認可ロジックが増えてきた場合は、Policyに切り出したほうが管理しやすくなります。
管理画面へのアクセス権限のような、モデルを問わない認可はGateで、投稿やコメントといったモデル単位の認可はPolicyで実装する、という使い分けが基本になります。



最初は全部Gateに書いてしまいがちですが、モデルが増えてきたタイミングでPolicyに移行するときれいに整理できます。
認可エラーのメッセージをカスタマイズする
AuthorizationExceptionのメッセージは、初期状態だと汎用的な文言になっています。
Responseクラスのdenyメソッドを使うと、Policyメソッドごとに個別のエラーメッセージを設定できます。
use Illuminate\Auth\Access\Response;
public function update(User $user, Post $post): Response
{
return $user->id === $post->user_id
? Response::allow()
: Response::deny('自分が作成した投稿のみ編集できます。');
}戻り値をResponse::allowやResponse::denyに変更することで、booleanを返す実装よりも柔軟なエラーメッセージを設定できます。
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
【厳選】フリーランスエンジニアにおすすめなエージェント3選


フリーランスエンジニアになるにはエージェントから案件をもらう必要があります。
僕が実際に利用しているおすすめエージェントを紹介しますね。



エージェントは必ず複数登録してください。
担当者によっては「全然案件紹介してくれない…」みたいなこともあるので…
僕は実際に5つのエージェントを使い回していますよ。
フリーランスを始めるなら「レバテックフリーランス


」
- 業界最大級の案件数。
- 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
- 案件参画中のフォローの充実。
※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。
レバテックフリーランス
![]()
![]()
とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!



僕もはじめてフリーランスの案件を貰ったのはレバテックフリーランス
![]()
![]()
保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。
手厚い保障を重視したいなら「Midworks


」
- 手厚い保障で正社員並みの安心感。
- 還元率60%超え&単価公開でクリアな契約。
- 給与保障制度(審査あり)。
Midworks
![]()
![]()
フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。



僕も何度か案件を紹介してもらいました。
自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。
週2〜3日の案件探しなら「ITプロパートナーズ


」
- IT案件に特化したフリーランスエージェント。
- 週2〜3日の案件が豊富。
- リモート案件が多く、直エンドなので単価も高い。
※詳細は「【週2・3案件】ITプロパートナーズとは?メリットや利用手順を解説!」を参照。
ITプロパートナーズ
![]()
![]()
週2〜3日から参画できる案件が豊富なので、起業したい人にもおすすめです。



週2〜3日の案件はある程度スキルがないと紹介してもらえない印象です。
とはいえ、週5の案件ももちろんありますし、僕が利用した時は迅速・丁寧に対応していただきました!
よくある質問
PolicyとGateはどちらを使うべきですか?
モデルに紐付く認可ロジックであれば、Policyを使うことをおすすめします。
モデルに関係しない認可ロジックの場合は、Gateを使うほうがシンプルに書けます。
Policyが自動で読み込まれないのですが、原因は何ですか?
PostモデルとPostPolicyのように、モデル名とPolicy名の対応関係が崩れている可能性があります。
命名規則に沿わない場合は、AppServiceProviderのbootメソッドでGate::policyメソッドを使い、手動で登録します。
複数の条件を組み合わせた認可ロジックも書けますか?
Policyメソッド内でif文を重ねたり、複数の条件をandやorで組み合わせたりする形で対応できます。
条件が複雑になる場合は、判定ロジックをモデルやサービスクラス側のメソッドに切り出すと見通しが良くなります。
まとめ
今回は、LaravelでPolicyを使った認可を実装する方法について解説しました。
以下が本記事のまとめになります。
- おすすめ本
Laravelの勉強なら「PHPフレームワーク Laravel入門 第2版



最後までお読みいただき、ありがとうございました!
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
- クソおすすめ本



海外のエンジニアがどういった思考で働いているかが理解できます。
海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。









