laravel5.5のmiddleware認証で、ブラウザバックでも確実に認証フォームを表示する方法(ブラウザバックだとセッションクリアするタイミングが無い!)
// 仕様
1, 特定のページ群(パスワードリセット・新規作成ボタン)は、Basic認証みたいにIDとパスワードで保護したい。
2, 認証ページ内は、一度パスワードを入力したら、以降は不要(セッション変数に保存)
3, ただし、トップページからリンクボタンで行く時は、再びIDとパスワードを必ず入力させたい。
ブラウザバックだとセッションクリアするタイミングが無いので、どうしたもんかな~と思ったけど
素直にmiddleware内に、アクセスURL別にクリア処理を入れれば、実装できた。
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 App\Section; class SectionAuthMiddleware { public function handle($request, Closure $next) { // パスワードリセット・新規作成ボタンを押す時には、必ずセクションIDとパスワードを入力させる if($request->method() == 'GET' && ( $request->path() == 'section/register' || $request->path() == 'section/password/reset')){ \Session::forget('section_auth_id'); \Session::forget('section_auth_password'); } \Log::info('$request->path() = ' . $request->path()); \Log::info('$request->method() = ' . $request->method()); // WebフォームからセクションID&パスワードが投げれたら、セッション変数に格納して、どこからでも使えるようにする(laravelでは標準で暗号化される) if ($request->has('section_auth_id') && $request->has('section_auth_password')) { session(['section_auth_id' => $request->input('section_auth_id')]); session(['section_auth_password' => $request->input('section_auth_password')]); } // セクションの存在チェック、見つからなかったらエラー表示して再入力させる $section = Section::get_section_info(); if(empty($section)){ return response()->view('auth.section_auth', compact('request','next')); }else{ // このままだとpost(入力値処理)になってしまうので、リダイレクトでgetにしてWeb入力画面にする return $next($request); } } } |