Laravelスターターキットは、認証まわりに Laravel Fortify を使うようになりました。
Fortifyは、ログイン・登録・パスワードリセット・メール認証・2段階認証(2FA)*などを提供する認証バックエンドです。
これによって、よりセキュリティ機能を追加のコーディングなしで利用可能となりました。変更点や、デフォルトで使える認証周りのあらたな機能をご紹介します。
*厳密にはFortify が提供するのは「2要素認証(Two-Factor Authentication)」です。ただ日本では一般的に「2段階認証」と呼ばれることが多いため、ここではその表現を使っています。
変更点
まずは変更点から。
ルート設定の変更
以前はroutes/auth.phpファイルに認証用ルート設定が書かれていました。現在は、下記のvendorディレクトリ以下に、認証用のルート設定ファイルがあります。
【routes.php】

なお、プロフィール変更用のルート設定は、以前と同様、routes/web.php内にあります。こちらには、後程ご紹介する2段階認証用のルート設定も追加されています。
【web.php】
|
1 2 3 4 5 6 7 8 9 10 |
Route::get('settings/two-factor', TwoFactor::class) ->middleware( when( Features::canManageTwoFactorAuthentication() && Features::optionEnabled(Features::twoFactorAuthentication(), 'confirmPassword'), ['password.confirm'], [], ), ) ->name('two-factor.show'); |
認証機能(バックエンド)
たとえばスターターキットでLivewireを選択した場合は、Livewireによって認証処理が作成されていました。変更後は、Fortifyが使われています。
これに伴い、Livewire選択時には、app/Livewire/Authのファイルがなくなりました。
表示用のファイルについては、以前と変わらず、resources/views/livewire/authにあります。
ただ、コードは一部変わっています。
たとえばユーザー登録フォームには、次のようにLivewireを使ってフォーム送信時の処理が設定されていました。
【register.blade.php(以前)】
|
1 |
<form wire:submit="register" class="flex flex-col gap-6"> |
現在は、次のように通常のLaravelのルートが設定されています。
【register.blade.php(現在)】
|
1 |
<form method="POST" action="{{ route('register.store') }}" class="flex flex-col gap-6"> |
なおReactとVue.jsの場合にも、Inertia.jsという技術を使用した実装になっていますが、いずれも、Fortifyを使って処理を行う流れに変更されています。
レート制限(Rate Limiting)
レート制限は以前も実装されていましたが、Fortifyでは、ログインや2段階認証実行時にレート制限が自動適用されます。
また、設定方法がより分かりやすくなりました。
app/Providers/FortifyServiceProvider.php内の configureRateLimiting() で設定されています。
【FortifyServiceProvider.php】
|
1 2 3 4 5 6 7 8 9 10 11 12 |
private function configureRateLimiting(): void { RateLimiter::for('two-factor', function (Request $request) { return Limit::perMinute(5)->by($request->session()->get('login.id')); }); RateLimiter::for('login', function (Request $request) { $throttleKey = Str::transliterate(Str::lower($request->input(Fortify::username())).'|'.$request->ip()); return Limit::perMinute(5)->by($throttleKey); }); } |
たとえば、次のようにログイン時のレート制限をLimit::perMinute(3) とすれば、1分以内に3回ログイン失敗で「Too Many Requests」 が返されます。
|
1 2 3 4 5 |
RateLimiter::for('login', function (Request $request) { $throttleKey = Str::transliterate(Str::lower($request->input(Fortify::username())).'|'.$request->ip()); return Limit::perMinute(3)->by($throttleKey); }); |

デフォルトで使える認証周りのあらたな機能
Fortifyによって、2要素認証(2FA)とリカバリーコード機能が使えるようになりました。
2段階認証(2FA)

Fortifyにより、ユーザーごとの2段階認証が標準で利用可能になりました。
ログイン後、ユーザー名をクリック(PCであれば画面左下・モバイルは画面右上)→「設定」→「2段階認証」から設定できます。
流れとしては、次の通りです。
-
【2段階認証】をクリック
-
パスワードを再入力
-
【2段階認証を有効にする】をクリック
-
QRコードを認証アプリ(Google Authenticator など)で登録
リカバリー機能
2段階認証を有効にすると、リカバリーコード(緊急用バックアップコード)が8個自動生成されます。
スマホの紛失や故障で認証アプリが使えなくなった場合でも、リカバリーコードを使えばログインできます。

さいごに
生成AI時代は、悪意ある人もAIを使って業務効率化ができてしまうので、セキュリティの懸念が一層増していると感じています。
今回の変更は、まさにそうした環境に対応するための改善といえます。

こういった時代に合わせたLaravel側の変更は、ありがたいなぁと感じます。
ただLaravel任せにせず、セキュリティ対策はいっそう厳しくしていきたいところ。WebアプリのセキュリティとLaravelの対策については、下記にシリーズ記事を連載中です。
ご興味あれば、併せて参考にしてください。
なお、本変更により、拙著「Laravelの教科書バージョン12」にも影響がでています。対応方法は下記FAQに掲載しております。
運営中の学習サイト「Laravelの教科書」も、今回の変更に合わせて変更済みです!

-120x68.png)
-120x68.png)