この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:10
ページ更新者:ぼうず
更新日時:2026-06-11 07:12:00

タイトル: ログイン画面(認証システム)の作成
SEOタイトル: 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
    <p>{{ Auth::user()->name }} さんでログイン中</p>
    <form method="POST" action="/logout">
        @csrf
        <button>ログアウト</button>
    </form>
@else
    <a href="/login">ログイン</a>
@endauth

{{-- 役割で出し分け --}}
@can('manage-posts')
    <a href="/admin/posts">記事管理</a>
@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。同一ドメインならセッションベース、サブドメイン違いならトークンベース。