laravel8で、一番シンプルな認証であるFortifyを試してみる(bladeファイルは自分で作る)
laravel8のユーザ認証について調べてみた。
5種類のユーザ認証が用意されているようだ
// フロント無し
1, Fortify(要塞化、シンプルなID・パスワードでログインするだけと思いきや、メール認証や二要素認証も出来る)
2, Sanctum(聖域、モバイルアプリ(APIトークン認証)やSPA(セッション(クッキー)認証)など、バックエンドのユーザ認証が出来る)
// フロントも作ってくれる
3, Laravel UI(6系から導入された。React/Vue.js/Bootstrapを使うのでフロントエンドが分からない勢を困惑させた)
4, Laravel Breeze(そよ風、バックはFortify、フロントはBladeなのでフロントエンドが分からない勢でも安心
5, Laravel Jetstream(ジェット気流、フロントはinteria(react/vue.js)かliveview(動的blade)から選べる。バックはSanctum+Fortifyと全部のせ)
laravel8はjetstream推しだけど、単純なcrudアプリならbreezeで十分だと思う。
laravel uiは残っているけど、今後のサポートはしなさそうなので新規ではやめておいた方が無難
基本と思われるfortifyを実装してみよう。
参考URL https://reffect.co.jp/laravel/laravel8-fortify
1, fortify+laravelのセットアップ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# laravel8本体のインストール composer create-project laravel/laravel laravel8 # fortifyのインストール cd laravel8 composer require laravel/fortify # fortifyに必要なファイルをvendorフォルダからlaravel8本体にコピー php artisan vendor:publish --provider="Laravel\Fortify\FortifyServiceProvider" Copied File [\vendor\laravel\fortify\stubs\fortify.php] To [\config\fortify.php] Copied File [\vendor\laravel\fortify\stubs\CreateNewUser.php] To [\app\Actions\Fortify\CreateNewUser.php] Copied File [\vendor\laravel\fortify\stubs\FortifyServiceProvider.php] To [\app\Providers\FortifyServiceProvider.php] Copied File [\vendor\laravel\fortify\stubs\PasswordValidationRules.php] To [\app\Actions\Fortify\PasswordValidationRules.php] Copied File [\vendor\laravel\fortify\stubs\ResetUserPassword.php] To [\app\Actions\Fortify\ResetUserPassword.php] Copied File [\vendor\laravel\fortify\stubs\UpdateUserProfileInformation.php] To [\app\Actions\Fortify\UpdateUserProfileInformation.php] Copied File [\vendor\laravel\fortify\stubs\UpdateUserPassword.php] To [\app\Actions\Fortify\UpdateUserPassword.php] Copied Directory [\vendor\laravel\fortify\database\migrations] To [\database\migrations] Publishing complete. |
config¥app.phpに、fortifyサービスを追加する
1 2 3 4 |
App\Providers\RouteServiceProvider::class, // ↑↑↑ここまで既存 // fortifyサービスを追加する App\Providers\FortifyServiceProvider::class, |
2, fortifyの不要?な機能は、とりあえずコメントアウト
app\config\fortify.phpでログイン機能(login, logout, register)以外はコメントアウト
php artisan route:listが激減する
1 2 3 4 5 6 7 8 9 10 |
'features' => [ Features::registration(), // Features::resetPasswords(), // パスワードリセット // // Features::emailVerification(), // メール認証 // Features::updateProfileInformation(),// プロフィール更新 // Features::updatePasswords(), // パスワード更新 // Features::twoFactorAuthentication([ // 二要素認証 // 'confirmPassword' => true, // ]), ], |
3, ログイン画面とユーザ登録画面を作る
app/Providers/FortifyServiceProvider.phpを修正。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public function boot() { Fortify::createUsersUsing(CreateNewUser::class); // login,logout,register以外はコメントアウト! // Fortify::updateUserProfileInformationUsing(UpdateUserProfileInformation::class); // Fortify::updateUserPasswordsUsing(UpdateUserPassword::class); // Fortify::resetUserPasswordsUsing(ResetUserPassword::class); // // RateLimiter::for('login', function (Request $request) { // return Limit::perMinute(5)->by($request->email.$request->ip()); // }); // // RateLimiter::for('two-factor', function (Request $request) { // return Limit::perMinute(5)->by($request->session()->get('login.id')); // }); // /loginでアクセスされたら、このビューを使え!というコードを追加 Fortify::loginView(function () { return view('auth.login'); }); // /reisterでユーザ登録画面へ Fortify::registerView(function () { return view('auth.register'); }); } |
ログイン画面を作る。resources/views/auth/login.blade.phpを作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Login</title> </head> <body> <h1>ログイン画面</h1> @if ($errors->any()) <div> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <form method="POST" action="/login"> @csrf <div> <label for="email">メールアドレス</label> <input name="email" type="email" value="{{old('email')}}"/> </div> <div> <label for="password">パスワード</label> <input name="password" type="password" /> </div> <div> <button type="submit">送信</button> </div> </form> </body> </html> |
ユーザ新規作成画面を作る。resources/views/auth/register.blade.phpを作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Login</title> </head> <body> <h1>ユーザ登録画面</h1> @if ($errors->any()) <div> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <form method="POST" action="{{ route("register") }}"> @csrf <div> <label for="name">ユーザ名</label> <input name="name" type="text" value="{{ old('name') }}"/> </div> <div> <label for="email">メールアドレス</label> <input name="email" type="email" value="{{ old('email') }}"/> </div> <div> <label for="email">パスワード</label> <input name="password" type="password"/> </div> <div> <label for="email">パスワード確認</label> <input name="password_confirmation" type="password"/> </div> <div> <button type="submit">登録</button> </div> </form> </body> </html> |
ユーザの新規登録&バリデーション処理は、app/Actions/CreateNewUser.phpで実装されている
4, ログイン後のホーム画面とログアウトボタンを作る
ユーザ新規登録に成功すると、自動ログインして/homeにリダイレクトされる。
1 2 3 4 |
// 認証されてない状態でアクセスするとlogin画面にリダイレクトされる Route::get('/home', function () { return view('auth.home'); })->middleware('auth'); |
ホーム画面(ログアウトボタン付き)を作る。resources/views/auth/home.blade.phpを作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Home</title> </head> <body> <h1>ホーム画面</h1> <p>ようこそLaravelアプリケーションへ</p> <form method="POST" action="{{ route('logout') }}"> @csrf <button type="submit">ログアウト</button> </form> </body> </html> |
これでfortifyを使ったログインユーザの新規作成・ログイン・ログアウトは出来た。