19.

Laravel 認証システム実装ガイド — Breeze / Jetstream / Fortify の使い分けと基本

編集
この記事の要点
  • Laravel 8 以降は make:auth が廃止。代わりに Breeze / Jetstream / Fortify から選ぶ
  • Breeze: 最小限の Blade + Tailwind、初学者と小規模に最適(composer require laravel/breeze --dev
  • Jetstream: 2 段階認証・チーム機能・API トークン込みのフルセット(Livewire か Inertia 選択)
  • Fortify: ビュー無しのバックエンドだけ。自分で画面を作りたい場合の土台
  • 内部は共通: User モデル + auth ミドルウェア + config/auth.phpguard / provider
  • 認証チェックは Auth::check() / Auth::user()、ログアウトは Auth::logout()

Laravel 認証システムの選択肢

パッケージ特徴適している案件
BreezeBlade + Tailwind の最小実装。ログイン/登録/PW リセット/メール認証小〜中規模、シンプル要件
Jetstream2FA / チーム / API トークン / プロフィール管理込みSaaS 系
Fortifyバックエンドのみ(ビュー無し)SPA や独自 UI
laravel/uimake:auth 後継、Bootstrap/Vue/ReactLaravel 6/7 互換、レガシー
SanctumSPA / モバイル向け API 認証(セッション or トークン)SPA / API
PassportOAuth2 サーバ実装外部公開 API

① Breeze で 5 分で作る(最も推奨)

# 新規プロジェクトの場合
composer create-project laravel/laravel myapp
cd myapp

# Breeze 導入
composer require laravel/breeze --dev
php artisan breeze:install        # 対話で stack 選択 (blade / livewire / react / vue)

# フロントエンド資産ビルド
npm install
npm run build

# DB マイグレーション
php artisan migrate

# 起動
php artisan serve
# → http://127.0.0.1:8000/login  /register  /forgot-password

Breeze で何が作られるか

  • routes/auth.php — 認証関連ルート(web.php から require)
  • app/Http/Controllers/Auth/ — Login / Register / PasswordReset 等のコントローラ
  • app/Http/Requests/Auth/LoginRequest.php — ログイン入力のバリデーション
  • resources/views/auth/ — login.blade.php, register.blade.php 等
  • app/Providers/RouteServiceProvider.phpHOME 定数(ログイン後リダイレクト先)

② Jetstream(フル機能)

composer require laravel/jetstream
php artisan jetstream:install livewire --teams
# または
php artisan jetstream:install inertia --teams

npm install && npm run build
php artisan migrate

追加で 2FA / チーム / Personal API Token / Profile 編集の画面が一通り入ります。要件が固まる前に入れると後で削るのが大変なので、必要が無ければ Breeze で十分です。

③ Fortify(ビュー無し)

composer require laravel/fortify
php artisan vendor:publish --provider="Laravel\Fortify\FortifyServiceProvider"
php artisan migrate

Fortify は POST /login や POST /register のエンドポイントだけ提供します。GET(画面表示)は自分で作ります。SPA から呼ぶ、または自前 Blade 画面と組み合わせる構成です。

認証の中身: config/auth.php

// config/auth.php
return [
    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],

    'guards' => [
        'web' => [
            'driver'   => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver'   => 'sanctum',
            'provider' => 'users',
        ],
    ],

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model'  => App\Models\User::class,
        ],
    ],
];

User モデルと auth ミドルウェア

// app/Models/User.php
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    protected $fillable = ['name', 'email', 'password'];
    protected $hidden   = ['password', 'remember_token'];
    protected $casts    = [
        'email_verified_at' => 'datetime',
        'password'          => 'hashed',
    ];
}

// routes/web.php
use Illuminate\Support\Facades\Route;

Route::middleware('auth')->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
    Route::get('/profile', [ProfileController::class, 'edit']);
});

Route::middleware('guest')->group(function () {
    Route::get('/login', [LoginController::class, 'create']);
});

認証状態を扱う API

use Illuminate\Support\Facades\Auth;

// 現在ログイン中か
if (Auth::check()) { ... }

// ログイン中のユーザー
$user = Auth::user();
$id   = Auth::id();

// 手動ログイン(メール + パスワード)
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
    request()->session()->regenerate();
    return redirect()->intended('/dashboard');
}

// ログアウト
Auth::logout();
request()->session()->invalidate();
request()->session()->regenerateToken();

// 特定ユーザーを強制ログイン(管理用途)
Auth::loginUsingId(1);

Blade での出し分け

@auth
    

{{ Auth::user()->name }} さんでログイン中

@csrf
@else ログイン @endauth {{-- 役割で出し分け --}} @can('manage-posts') 記事管理 @endcan

カスタムガード(管理者用認証など)

// config/auth.php に admin ガードを追加
'guards' => [
    'web'   => ['driver' => 'session', 'provider' => 'users'],
    'admin' => ['driver' => 'session', 'provider' => 'admins'],
],
'providers' => [
    'users'  => ['driver' => 'eloquent', 'model' => App\Models\User::class],
    'admins' => ['driver' => 'eloquent', 'model' => App\Models\Admin::class],
],

// ルート
Route::middleware('auth:admin')->prefix('admin')->group(function () {
    Route::get('/dashboard', ...);
});

// 取得
$admin = Auth::guard('admin')->user();

FAQ

Q: php artisan make:auth が使えない
A: Laravel 6 以前のコマンド。今は composer require laravel/uiphp artisan ui:auth、または Breeze を使ってください。

Q: パスワードハッシュは何を使っている?
A: 標準で bcryptconfig/hashing.php で argon2id / argon2i に切替可)。Hash::make($pw) でハッシュ生成、Hash::check($pw, $hash) で検証。

Q: SPA で認証したい
A: Laravel Sanctum + Breeze(API モード)または Fortify。同一ドメインならセッションベース、サブドメイン違いならトークンベース。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. インストールと設定
  2. クイックスタート & チュートリアル(初心者向け)
  3. クイックスタート & チュートリアル(中級者向け)
  4. ルーティング
  5. Bladeテンプレート(ビュー/レイアウト)
  6. コントローラー
  7. マイグレーションとテーブル定義
  8. データベースの設定
  9. Eloquentモデル (ORM)
  10. SQLとクエリビルダー
  11. バリデーション
  12. .envファイルの設定値へのアクセス
  13. 動作環境による分岐処理
  14. configフォルダ配下の設定値へのアクセス
  15. assetヘルパーを利用したpublicフォルダへのアクセス
  16. storageフォルダへのアクセス
  17. アプリケーション名の変更
  18. メンテナンス
  19. ログイン画面(認証システム)の作成
  20. ログインの必須化
  21. ログインユーザー情報の取得
  22. ルートの認証化
  23. 本番サーバーへのデプロイ方法
  24. 多言語化
  25. csrf_field
  26. ファイルのダウンロード
  27. CSVのアップロードおよび読み込み(maatwebsite/excel)
  28. ページタイトルの設定
  29. コマンド一覧
  30. エラー一覧
  31. SQLの実行ログ出力方法
  32. キャッシュのクリア
  33. Selectの結果の最初もしくは最後に任意の値を追加する方法
  34. ajaxでPOST通信する際の注意点
  35. ソーシャルログインの実装
  36. セッション情報の確認
  37. ログイン、ユーザー登録、パスワードリセット後のリダイレクト先の変更方法
  38. redirectやreturn viewにメッセージを付与する方法
  39. クッキー(cookie)の設定と取得
  40. クラスの再読み込み
  41. csrfの有効時間を変更する方法
  42. ViewComposerを用いてviewに共通の値を付与する方法
  43. View::shareを用いて共通の値を各ビューに渡す方法
  44. ミドルウェアを用いた処理の共通化
  45. Middleware内でAuth::check()などを使用する方法
  46. Controller以外でリダイレクトする方法
  47. セッションの値の取得/保存/更新/削除
  48. $requestの値を変更する方法
  49. 常時SSL化
  50. ページング(ページネーション)をする方法
  51. vue.jsとの連携
  52. Vue.jsと連携するSPA実行環境構築
  53. .envの値をvue.jsで参照する方法
  54. vue.jsを本番環境にリリースする方法
  55. could not find driver(Windows, MySQL編)