Laravelのログイン維持(Remember me)機能でのログインをハンドリングする
php artisan make:auth
で作成できる、Laravelの標準ログインではログイン維持(Remember Me)機能がサポートされています。
チェックボックスをオンにしてログインすると、users
テーブルにremember_token
を保存して、サーバセッションがタイムアウトになってもブラウザのCookieからログインを試行してくれる機能です(セッション自体はタイムアウトするためユーザーセッションに保存してたデータは空になります)。便利な機能なのですが、先日これでログインすることにより、通常のログイン時に行っている処理がすっ飛ばされてしまったので、この機能でのログインをハンドリングする方法を調べてみました。
同じようにハマってる人もいるようです。
この機能を使用している時に、ユーザーが”remember me”クッキーを使用して認証されているかを判定するには、viaRemember
メソッドを使用します。 Laravel 6.x 認証
公式マニュアルを見ると、viaRemember
メソッドを使えばremember meでのログインなのかどうか判断できるようです。検証しやすくするために
session.php
のexpire_on_close
をtrueにしておきます。
/*
|--------------------------------------------------------------------------
| Session Lifetime
|--------------------------------------------------------------------------
|
| Here you may specify the number of minutes that you wish the session
| to be allowed to remain idle before it expires. If you want them
| to immediately expire on the browser closing, set that option.
|
*/
'lifetime' => env('SESSION_LIFETIME', 120),
'expire_on_close' => true,
remember meでのログインを捉えるためにミドルウェアを作成します。
php artisan make:middleware RememberMeHandler
<?php
namespace App\https\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
class RememberMeHandler
{
/**
* Handle an incoming request.
*
* @param \Illuminate\https\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(Auth::viaRemember()){ // Remember Meでの認証時
Log::notice('Remember Me Logged in');
// 行いたい処理を書く
}
return $next($request);
}
}
Kernel.php
に登録します。
protected $middlewareGroups = [
'web' => [
…
'remember_me_handler',
],
'api' => [
'throttle:60,1',
'bindings',
],
];
protected $routeMiddleware = [
…
'remember_me_handler' => \App\https\Middleware\RememberMeHandler::class,
];
このようなログが出てれば成功です。
[2020-03-26 05:09:30] local.NOTICE: Remember Me Logged in
リロードしても再度ログが吐かれることはないので、通常ログイン時の処理をここでも行うことができます。
ディスカッション
コメント一覧
まだ、コメントがありません