対象バージョン: 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 です。
よくある混同と注意点
- 認証できた=全部許可ではない
ログイン成功後も、Gate / Policy(または同等の認可)で操作単位の可否を確認してください。
- Gate の定義場所を AuthServiceProvider にしない(現行)
古い記事や 10.x 時代の記憶で AuthServiceProvider を探すと、13.x fresh にはファイルがありません。
- Policy は生成だけでは認可にならない
make:policy のあと、can / authorize / middleware などで実際に判定してください。
- laravel/ui を現行の第一選択にしない
新規は Starter Kits。legacy パッケージとしての位置づけを混同しないでください。
まとめ
- 対象は Laravel 13.x / PHP 8.3+。認証は「誰か」、認可は「何をしてよいか」。
- 認証の主手順は Application Starter Kits(React / Vue / Livewire / Svelte)。
laravel/uiは現行デフォルトではない。 - セッション認証では
Auth::user/authmiddleware、必要ならAuth::attempt+regenerate、ログアウト時のinvalidate+regenerateTokenを押さえる。 - 認可は Gate(クロージャ) と Policy(モデル中心)。Gate 定義は **
AppServiceProvider::boot**。 - Policy は
make:policyのあと、can/Gate::authorize/canmiddleware まで書いて初めて機能する。不許可は 403。