Laravel 認証 Breeze 調べてみた

Laravel Breezeとは

Laravel Breezeとは、認証処理の機能・コードをひとまとめにして提供してくれるパッケージのことです。

Laravel8から導入された新しい認証機能になります。

 

Laravel  Breezeの導入

1、composerでパッケージをrequireします。

composer require laravel/breeze

2、インストールします。

php artisan breeze:install

以上のコマンドで認証用のファイルとルーティングが設定されます。

3、npm install && npm run devをします。

npm install && npm run dev

別々に実行しても問題ありません。

4、マイグレーションを実行します。

php artisan migrate

 

Laravel Breezeのルーティング

Laravel  Breezeをインストールすると、web.phpが以下のように書き変わります。

※インストール以前に記述されていた内容が消えてしまうので、注意してください。

<?php
use Illuminate\Support\Facades\Route;

Route::get('/', function () {
 return view('welcome');
});

Route::get('/dashboard', function () { ・・・①
 return view('dashboard');
})->middleware(['auth'])->name('dashboard');

require __DIR__.'/auth.php'; ・・・②

①デフォルトでは、ログイン後は/dashbordにルーティングされます。

②認証関連のルーティングが定義されているauth.phpをrequireしています。

以下auth.phpになります。

<?php
use App\Http\Controllers\Auth\AuthenticatedSessionController;
use App\Http\Controllers\Auth\ConfirmablePasswordController;
use App\Http\Controllers\Auth\EmailVerificationNotificationController;
use App\Http\Controllers\Auth\EmailVerificationPromptController;
use App\Http\Controllers\Auth\NewPasswordController;
use App\Http\Controllers\Auth\PasswordResetLinkController;
use App\Http\Controllers\Auth\RegisteredUserController;
use App\Http\Controllers\Auth\VerifyEmailController;
use Illuminate\Support\Facades\Route;

Route::get('/register', [RegisteredUserController::class, 'create'])
 ->middleware('guest')
 ->name('register');

Route::post('/register', [RegisteredUserController::class, 'store'])
 ->middleware('guest');

Route::get('/login', [AuthenticatedSessionController::class, 'create'])
 ->middleware('guest')
 ->name('login');

Route::post('/login', [AuthenticatedSessionController::class, 'store'])
 ->middleware('guest');

Route::get('/forgot-password', [PasswordResetLinkController::class, 'create'])
 ->middleware('guest')
 ->name('password.request');

Route::post('/forgot-password', [PasswordResetLinkController::class, 'store'])
 ->middleware('guest')
 ->name('password.email');

Route::get('/reset-password/{token}', [NewPasswordController::class, 'create'])
 ->middleware('guest')
 ->name('password.reset');

Route::post('/reset-password', [NewPasswordController::class, 'store'])
 ->middleware('guest')
 ->name('password.update');

Route::get('/verify-email', [EmailVerificationPromptController::class, '__invoke'])
 ->middleware('auth')
 ->name('verification.notice');

Route::get('/verify-email/{id}/{hash}', [VerifyEmailController::class, '__invoke'])
 ->middleware(['auth', 'signed', 'throttle:6,1'])
 ->name('verification.verify');

Route::post('/email/verification-notification', [EmailVerificationNotificationController::class, 'store'])
 ->middleware(['auth', 'throttle:6,1'])
 ->name('verification.send');

Route::get('/confirm-password', [ConfirmablePasswordController::class, 'show'])
 ->middleware('auth')
 ->name('password.confirm');

Route::post('/confirm-password', [ConfirmablePasswordController::class, 'store'])
 ->middleware('auth');

Route::post('/logout', [AuthenticatedSessionController::class, 'destroy'])
 ->middleware('auth')
 ->name('logout');

認証機能一連のルーティングが定義されています。

見慣れないコントローラーなどがあるかもしれませんが、これらのファイルがLaravel Breezeをインストールした際に、作成されたものになります。

 

Laravel Breezeの登録処理

Laravel Breezeの登録処理は、App\Http\Controllers\Auth\RegisteredUserController.phpで行われています。

App\Http\Controllers\Auth\RegisteredUserController.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Models\User;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rules;

class RegisteredUserController extends Controller
{
    public function create() ・・・①
    {
        return view('auth.register');
    }

    public function store(Request $request) ・・・②
    {
        $request->validate([ ・・・③
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => ['required', 'confirmed', Rules\Password::defaults()],
        ]);

        $user = User::create([ ・・・④
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
        ]);

        event(new Registered($user)); ・・・⑤

        Auth::login($user); ・・・⑥

        return redirect(RouteServiceProvider::HOME); ・・・⑦
    }
}

①createメソッドでBladeテンプレートを表示させています。

登録画面のデフォルトのBladeテンプレートは、App\resouces\views\auth\register.blade.phpになります。

②storeメソッドで登録処理を実装しています。

③validateメソッドでバリデーションを実装しています。

④Eloquentモデルのcreateメソッドでユーザー情報を登録しています。

⑤eventに設定されているlisternerがあれば、このタイミングで処理されます。

⑥ログイン処理を実装します。

⑦RouteServicePrivideクラスのHOMEに定義されているURLにリダイレクトします。

App\Prividers\Prividers\RouteServiceProvider.php

<?php
namespace App\Providers;

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;

class RouteServiceProvider extends ServiceProvider
{
 public const HOME = '/dashboard'; ・・・①

 // protected $namespace = 'App\\Http\\Controllers';

 public function boot()
 {
 $this->configureRateLimiting();

 $this->routes(function () {
 Route::prefix('api')
   ->middleware('api')
   ->namespace($this->namespace)
   ->group(base_path('routes/api.php'));

 Route::middleware('web')
   ->namespace($this->namespace)
   ->group(base_path('routes/web.php'));
 });
 }

 protected function configureRateLimiting()
 {
 RateLimiter::for('api', function (Request $request) {
   return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
 });
 }
}

①登録処理後にリダイレクトされるページになります。

 

Laravel Breezeのログイン処理

Laravel Breezeのログイン処理はApp\Http\Controllers\Auth\AuthenticatedSessionController.phpで実装されています。

App\Http\Controllers\Auth\AuthenticatedSessionController.php

<?php
namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\LoginRequest;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AuthenticatedSessionController extends Controller
{
 public function create() ・・・①
 {
   return view('auth.login');
 }

 public function store(LoginRequest $request) ・・・②
 {
   $request->authenticate(); ・・・③

   $request->session()->regenerate(); ・・・④

   return redirect()->intended(RouteServiceProvider::HOME); ・・・⑤
 }

 public function destroy(Request $request) ・・・⑥
 {
   Auth::guard('web')->logout();

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

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

   return redirect('/');
 }
}

①createメソッドでBladeテンプレートを表示しています。

ログイン画面のデフォルトのBladeテンプレートは、App\resouces\views\auth\login.blade.phpになります。

②storeメソッドでログイン処理を実装しています。

DIで注入されているLoginRequestはFormRequestを継承していて、ここでバリデーション処理が実行されています。

App\Http\Request\Auth\LoginRequest.php

<?phpnamespace App\Http\Requests\Auth;

use Illuminate\Auth\Events\Lockout;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;

class LoginRequest extends FormRequest
{
 public function authorize()
 {
 return true;
 }

 public function rules() ・・・1
 {
 return [
 'email' => 'required|string|email',
 'password' => 'required|string',
 ];
 }

 public function authenticate()
 {
 $this->ensureIsNotRateLimited();

 if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {
 RateLimiter::hit($this->throttleKey());

 throw ValidationException::withMessages([
 'email' => __('auth.failed'),
 ]);
 }

 RateLimiter::clear($this->throttleKey());
 }

 public function ensureIsNotRateLimited()
 {
 if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) {
 return;
 }

 event(new Lockout($this));

 $seconds = RateLimiter::availableIn($this->throttleKey());

 throw ValidationException::withMessages([
 'email' => trans('auth.throttle', [
 'seconds' => $seconds,
 'minutes' => ceil($seconds / 60),
 ]),
 ]);
 }

 public function throttleKey()
 {
 return Str::lower($this->input('email')).'|'.$this->ip();
 }
}

1バリデーションルールが記載されています。

③authenticateメソッドでログイン処理を実行しています。

authenticateメソッドは上記ファイルに実装されています。

④セッションIDを再発行しています。

⑤リダイレクト処理をしています。リダイレクト先は登録処理で定義したものと同様の部分になります。

⑥destoryメソッドでログアウト処理を実行しています。

 

以上!!!!!!!