ラボ > Laravel、Lumen:ユーザー認証関連
laravel8 すべての端末からログアウトさせたい
複数の端末でログインしていてもお構いなしにログアウトさせたい(※ミドルウェア(middleware)が絡む)
作成日:2023-07-06, 更新日:2023-09-20
パスワードを更新したときログアウト
パスワードを更新したら別端末でのログイン状態をログアウトにする
▼「app/Http/Kernel.php」に追加
~ 略 ~ protected $middlewareGroups = [ 'web' => [ ~ 略 ~ \Illuminate\Session\Middleware\AuthenticateSession::class, ~ 略 ~ ], ~ 以下、略 ~
※「web」の中なら最初でも最後でも途中でも良さげ
無条件でログアウトさせたい
「パスワード更新したとき」じゃなくて「好きなタイミング」でログアウトさせたい
処理の流れ
セッションとusersテーブルで何かを比較してやる感じで、
- ログイン時にセッションにフラグをセット
- ログインチェック時にセッションにセットしたフラグと何かを比較
- 条件によってログアウト or そのままログイン状態続行
任意のタイミングで比較対象を書き換えてあげればOK。
やるコト
「セッションにセットするフラグ」は「日時」、「比較対象」は「usersテーブルにセットする日時」とする
→好きなタイミングで「usersテーブルにセットする日時」を最新にすれば他の端末で強制ログアウトができるって感じ
- usersテーブルの修正
- ログイン時の処理
- ミドルウェアの作成
- カーネルに登録
usersテーブルの修正
「users.comparison_at」をint型で追加。
※マイグレーション関連の記載は省略。
ログイン時の処理
▼ログイン成功時にセッション追加
~ 略 ~ xxxxx(Request $request) { ~ 略 ~ $key = xxxxx; $request->session()->put($key, time()); ~ 以下、略 ~
ミドルウェアの作成
ファイルの作成
▼artisanコマンド実行
$ ./vendor/bin/sail php artisan make:middleware CheckRequiredRegister
→「app/Http/Middleware/CheckRequiredRegister.php」が作られる
ファイルの修正
▼「app/Http/Middleware/CheckRequiredRegister.php」
~ 略 ~ public function handle(Request $request, Closure $next): Response { if( auth()->check() ){ $user = auth()->user(); // ======================================= // 全端末での強制ログアウトのチェック $key = xxxxx; $chk_at = $request->session()->get($key, false); if ( $chk_at < $user->comparison_at ) { Auth::logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect()->route('login'); } $request->session()->put($key, time()); } return $next($request); } ~ 以下、略 ~
カーネルに登録
▼「app/Http/Kernel.php」に追加
~ 省略 ~ protected $middlewareGroups = [ 'web' => [ ~ 省略 ~ \App\Http\Middleware\CheckRequiredRegister::class, ], 'api' => [ ~ 省略 ~ ], ]; ~ 省略 ~