【PHP】Laravelで認証と認可を実装する方法

対象バージョン: Laravel 13.x / PHP 8.3+(2026年時点のシリーズ基準) 一次ソース: Authentication / Authorization / Starter Kits

こんにちは。この記事では、Laravel で認証(Authentication)と認可(Authorization)を実装する基本手順を整理します。ログインまわりの導入から、ルート保護、Gate / Policy による権限判定までを、現行の Laravel 13.x 公式ドキュメントに沿って説明します。SSO や Sanctum / Passport の深掘り、メール検証の詳細などは扱いません。まずは「誰か」と「何をしてよいか」を混同せずに実装できる状態を目指します。

この記事で分かること

  • 認証と認可の違い(混同しやすいポイント)
  • Laravel 13.x における認証の主手順(Application Starter Kits)
  • セッション認証の基本操作(ユーザー取得・middleware・ログイン/ログアウト)
  • Gate と Policy の役割分担
  • AppServiceProvider での Gate 定義と 403 への扱い
  • Policy の生成から can / authorize / middleware での利用まで

対象バージョンと認証・認可の違い

本記事の前提は Laravel 13.x / PHP 8.3+ です。Laravel 13 は 2026年3月17日リリースの現行メジャーであり、サポート表上 PHP 8.3〜8.5 を対象とします(Release Notes)。フレームワーク本体も php: ^8.3 を要求します。

認証と認可は別物です

概念問いざっくりの意味
認証(Authentication)あなたは誰ですか?ユーザーを特定し、ログイン状態を確立する
認可(Authorization)その操作をしてよいですか?認証済みユーザーが特定アクションを実行できるか判断する

ログイン済みでも、すべての操作が許可されるわけではありません。公式も「認証済みであっても認可されていない場合がある」と区別しています(Authentication / Authorization)。

あわせて、ガード/プロバイダ(認証まわりの仕組み)と、ロール/パーミッション(認可の設計)を混同しないようにしてください。ガードは「どう本人確認するか」、ロール等は「何を許可するか」の話です。


認証の導入(現行の主手順)

公式 Quickstart は Application Starter Kits

Laravel 13.x の Authentication ドキュメントにおける Quickstart の主経路は、Application Starter Kit の導入です(Authentication — Quickstart)。公式の現行キットは次の4種です(Starter Kits)。

  • React
  • Vue
  • Livewire
  • Svelte

いずれも登録・ログインなどの認証スキャフォールドを含みます。プロジェクト作成時にキットを選びます。

laravel new my-app

対話で Starter Kit を選択したあと、フロント資産の依存関係を入れ、開発用プロセスを起動します。

cd my-app
npm install && npm run build
composer run dev

作成後はキットが提供する登録・ログイン画面(例: /register など)から動作を確認できます。現行公式 Starter Kits の認証バックエンドは Laravel Fortify です。本記事では Fortify 自体は深掘りしませんが、「キット経由で認証ルートが用意される」と理解しておけば十分です。

> 補足: Starter Kit は必須ではありません。使わない場合は、後述の手動ログイン(Auth::attempt など)で組み込みのセッション認証を利用できます(Authentication)。

laravel/ui について(現行デフォルトではありません)

以前よく使われた laravel/ui と php artisan ui * --auth は、パッケージ自身の README で legacy と明記されています(laravel/ui README)。Laravel 13.x との互換表上は動く場合がありますが、13.x Authentication 公式ドキュメントの主経路ではありません。新規学習・新規実装では Starter Kits を選んでください。


セッション認証の基本操作

ブラウザ向けの組み込み認証は、session guard(セッション+Cookie)を中心とします(Authentication)。

認証済みユーザーの取得

use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;

// Facade
$user = Auth::user();
$id = Auth::id();

// Request 経由
$user = $request->user();

ログイン状態の確認には Auth::check() もありますが、**ルート保護には通常 auth middleware** を使います。

ルート保護(auth / guest)

Route::get('/dashboard', function () {
    // ...
})->middleware('auth');

middleware('auth') を付けると、未認証ユーザーは拒否され、既定では login 名前付きルートへリダイレクトされます。リダイレクト先は bootstrap/app.php の redirectGuestsTo で変更できます。

一方、ログイン画面など「未ログイン専用」にしたいルートには guest middleware を使います。認証済みユーザーは dashboard または home へリダイレクトされ、行き先は redirectUsersTo で変更できます。

手動ログイン(Auth::attempt)

Starter Kit を使わず、コントローラ等でログイン処理を書く場合の公式パターンです。成功後に セッション ID を再生成し、セッション固定攻撃を防ぎます。

use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;

// $credentials は email / password などを含む配列
if (Auth::attempt($credentials)) {
    $request->session()->regenerate();

    // 認証成功後のリダイレクト先はアプリに合わせる
    return redirect('/dashboard');
}

成功時は必ず session()->regenerate() を呼びます。失敗時のエラー表示や入力バリデーションはアプリ側で別途実装してください。

ログアウト

use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;

public function destroy(Request $request)
{
    Auth::logout();

    $request->session()->invalidate();
    $request->session()->regenerateToken();

    return redirect('/');
}

logout のあとにセッションの invalidate と CSRF トークンの regenerateToken を行い、通常は / へリダイレクトします。


認可の全体像(Gate と Policy)

認可の主手段は次の2つです(Authorization)。

手段特徴向いている用途
Gateクロージャ(またはクラス)で定義する権限チェックモデルに縛られない単発の許可判定
Policyモデル中心のクラスにメソッドをまとめるPost の更新・削除などリソース単位の権限

Gate と Policy は混在させて問題ありません。小さな判定は Gate、モデル操作は Policy、という使い分けが一般的です。


Gate の定義と利用

定義場所は AppServiceProvider::boot

Laravel 13.x では、Gate は通常 App\Providers\AppServiceProvider の boot メソッド内で Gate::define により定義します(Authorization)。fresh な Laravel 13 スケルトンの bootstrap/providers.php は AppServiceProvider のみを登録し、app/Providers に AuthServiceProvider は存在しません。

> 歴史注記: Laravel 10.x の公式ドキュメントでは、Gate を AuthServiceProvider の boot で定義すると記載されていました。現行 13.x の学習・新規実装では AppServiceProvider を使ってください。

use App\Models\Post;
use App\Models\User;
use Illuminate\Support\Facades\Gate;

public function boot(): void
{
    Gate::define('update-post', function (User $user, Post $post) {
        return $user->id === $post->user_id;
    });
}

判定と 403

use Illuminate\Support\Facades\Gate;

if (Gate::allows('update-post', $post)) {
    // 許可時の処理
}

if (Gate::denies('update-post', $post)) {
    abort(403);
}

// 不許可時は AuthorizationException → Laravel が 403 レスポンスに変換
Gate::authorize('update-post', $post);
  • allows / denies … 真偽で分岐したいとき
  • authorize … 不許可なら例外(結果として 403)にしたいとき
  • 明示的に abort(403) する書き方も公式で示されています

Policy の作成と利用

Policy は「生成して終わり」ではなく、コントローラやルートから呼び出すところまでが実装です。

生成

php artisan make:policy PostPolicy --model=Post

app/Policies 配下にクラスが生成され、--model=Post を付けると viewAny / view / create / update / delete などの雛形メソッド付きになります。

登録(自動ディスカバリ)

標準命名(モデル Post → PostPolicy、Policies ディレクトリ)に従えば、Policy は 自動ディスカバリされます。手動登録が必要な場合は、AppServiceProvider での Gate::policy、またはモデルの #[UsePolicy] 属性を使います。

利用例(can / authorize / middleware)

コントローラやリクエストから:

use Illuminate\Support\Facades\Gate;
use Illuminate\Http\Request;

// User の can / cannot
if ($request->user()->can('update', $post)) {
    // 許可時
}

if ($request->user()->cannot('update', $post)) {
    abort(403);
}

// Gate::authorize(Policy メソッド名をアクションとして渡す)
Gate::authorize('update', $post);

ルートでは can ミドルウェア(またはルートの ->can())で保護できます。

Route::put('/posts/{post}', [PostController::class, 'update'])
    ->middleware('can:update,post');

Blade では @can / @cannot で表示を切り替えられます。いずれの経路でも、不許可時の典型的な結果は 403 です。


よくある混同と注意点

  1. 認証できた=全部許可ではない

ログイン成功後も、Gate / Policy(または同等の認可)で操作単位の可否を確認してください。

  1. Gate の定義場所を AuthServiceProvider にしない(現行)

古い記事や 10.x 時代の記憶で AuthServiceProvider を探すと、13.x fresh にはファイルがありません。

  1. Policy は生成だけでは認可にならない

make:policy のあと、can / authorize / middleware などで実際に判定してください。

  1. laravel/ui を現行の第一選択にしない

新規は Starter Kits。legacy パッケージとしての位置づけを混同しないでください。


まとめ

  • 対象は Laravel 13.x / PHP 8.3+。認証は「誰か」、認可は「何をしてよいか」。
  • 認証の主手順は Application Starter Kits(React / Vue / Livewire / Svelte)。laravel/ui は現行デフォルトではない。
  • セッション認証では Auth::user / auth middleware、必要なら Auth::attempt+regenerate、ログアウト時の invalidate+regenerateToken を押さえる。
  • 認可は Gate(クロージャ) と Policy(モデル中心)。Gate 定義は **AppServiceProvider::boot**。
  • Policy は make:policy のあと、can / Gate::authorize / can middleware まで書いて初めて機能する。不許可は 403。

参考リンク(公式)

コメントする