laravel5.5でセカンドパスワードを実装してみた。クレカ番号+セキュリティコード(3ケタ数字)みたいな感じ。
1, 例によってミドルウェアを作る
1 |
php artisan make:middleware SecondPasswordMiddleware |
kernel.phpにも追加しておく
1 |
'second.auth' => 'App\Http\Middleware\SecondPasswordMiddleware', |
2, 中身を実装
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 |
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; // 認証ユーザ use Illuminate\Support\Facades\Hash; // パスワード比較用 class SecondPasswordMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { //セッション変数にパスワードがあれば変数に格納 $second_password = session('second_password'); if ($request->has('second_password')) { $second_password = $request->input('second_password'); // メッセージパスワードをセッション変数に格納して、どこからでも使えるようにする(laravelでは標準で暗号化される) session(['second_password' => $second_password]); } // セカンドパスワードで認証済かどうかは、formでパスワードを投げてきたorセッション変数に入っているかで確認する if(Hash::check($second_password, Auth::user()->second_password)){ // userテーブルにカラム追加しておく return $next($request); }else{ return response()->view('auth.second_password', compact('request','next')); } } } |
3, セカンド・パスワードだけ入力するbladeフォームを作る。
コツはactionが空欄な事(既に目的のurlになっているが、ミドルウェアで見れない) & getだとurl引数にパスワードが表示されるのでpost
1 2 3 4 5 6 |
<form name="" method="post" action=""> {{ csrf_field() }} <h1>セカンド・パスワードの確認</h1> <input type="password" name="message_password"> <button type="submit">入 力</button> </form> |
4, ルーティング(web.php)で、目的のurlに対してpostでも行けるようにする
1 2 3 4 5 6 7 8 |
Route::group(['middleware' => 'second.auth'], function() { Route::match(['get','post'], '/test1', 'HomeController@test1'); Route::match(['get','post'], '/test2', 'HomeController@test2'); // postしか必要なければ、わざわざgetを定義しなくても大丈夫 Route::post('test3', 'HomeController@test3'); }); |