Laravel 8.75实现含记住我认证的登录历史功能问题
解决Laravel“记住我”自动登录不记录登录历史的问题
问题原因
你当前的登录历史记录逻辑仅在手动提交登录表单时触发(通过LoginRequest@authenticate里的自定义LoginEvent),但Laravel的“记住我”自动登录是框架在会话启动阶段完成的,不会走LoginRequest的认证流程,因此不会触发你的自定义事件,导致无法记录登录历史。
推荐解决方案:监听Laravel自带的Login事件
Laravel内置了Illuminate\Auth\Events\Login事件,该事件会在所有登录场景下触发(包括手动登录、记住我自动登录、社交登录等),只需修改你的监听器来监听这个事件即可覆盖所有情况。
步骤1:修改LoginListener
更新监听器的逻辑,使其接收Laravel自带的Login事件,并从中获取用户信息:
<?php namespace App\Listeners; use Illuminate\Auth\Events\Login; use App\Models\LoginHistory; use Carbon\Carbon; class LoginListener { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param Login $event * @return void */ public function handle(Login $event) { LoginHistory::create([ 'user_id' => $event->user->id, 'login_at' => Carbon::now()->toDateTimeString(), // 可选:记录登录方式,区分手动登录和记住我自动登录 'login_method' => $event->remember ? 'remember_token' : 'manual' ]); } }
步骤2:注册监听器
在app/Providers/EventServiceProvider.php中,将监听器绑定到Laravel的Login事件:
protected $listen = [ // ... 其他事件绑定 \Illuminate\Auth\Events\Login::class => [ \App\Listeners\LoginListener::class, ], ];
步骤3:移除冗余代码
由于Login事件已经覆盖了手动登录场景,你可以删除LoginRequest@authenticate中的以下代码:
event(new LoginEvent($user->id));
备选方案:通过中间件处理记住我自动登录
如果你希望保留自定义LoginEvent,可以通过中间件检测用户是否通过记住我令牌登录,并触发事件:
步骤1:创建中间件
php artisan make:middleware RecordRememberLogin
步骤2:编写中间件逻辑
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; use App\Events\LoginEvent; class RecordRememberLogin { public function handle($request, Closure $next) { // 检查用户已认证、通过记住我登录,且未记录过本次登录 if (Auth::check() && Auth::viaRemember() && !session()->has('remember_login_recorded')) { event(new LoginEvent(Auth::id())); // 标记会话,避免重复记录 session()->put('remember_login_recorded', true); } return $next($request); } }
步骤3:注册中间件
在app/Http/Kernel.php的web中间件组中添加该中间件(需放在StartSession之后):
protected $middlewareGroups = [ 'web' => [ // ... 其他中间件 \App\Http\Middleware\StartSession::class, \App\Http\Middleware\RecordRememberLogin::class, // ... ], ];
内容的提问来源于stack exchange,提问作者Petitemo
相关产品推荐
相关产品推荐

