You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 17:17:49