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

Laravel单账号多标签登录限制功能跳转异常求助

问题诊断与解决方案

核心问题原因

你遇到的登录后跳转回登录页的问题,本质是Laravel自带的"记住我"功能与你手动管理的remember_token冲突:当你调用Auth::login($user, $request->has('remember'))时,如果用户勾选了"记住我",Laravel会自动生成新的remember_token并覆盖你手动设置的值,导致Session中存储的token与数据库中的token不一致,触发中间件的登出跳转逻辑。

分步解决方案

1. 修复登录逻辑,避免Token冲突

修改ConnectionController中的登录代码,禁用Laravel自动的"记住我"功能,同时简化Token更新逻辑:

public function VerifConnection(Request $request)
{
    $programController = new ProgramController();
    $programs = $programController->GetProgramsFromBDD($request);
    $credentials = $request->only('Identifiant', 'Password');
    $user = User::where('Identifiant', $credentials['Identifiant'])->first();

    if ($user && Hash::check($credentials['Password'], $user->Password)) {
        Log::info('User found:', ['user' => $user]);
        Log::info('Password matches');
        
        // 生成新Token并通过Eloquent保存(替代手动SQL)
        $user->remember_token = Str::random(60);
        $user->save();
        
        Log::info('New token:', [$user->remember_token]);

        // 登录用户,禁用Laravel自带的"记住我"功能
        Auth::login($user);
        // 将新Token存入Session
        $request->session()->put('remember_token', $user->remember_token);
        
        return redirect()->route('ProgramView');
    }

    Log::warning('Password does not match');
    return redirect()->back()->withErrors([
        'Identifiant ou mot de passe incorrect.'
    ]);
}

2. 优化中间件的Token比对逻辑

修改Middleware/Authentificate.php,确保每次请求都获取数据库中最新的用户Token,避免Session缓存旧数据:

protected function redirectTo($request)
{
    if (!$request->expectsJson()) {
        return route('Connection');
    }
}

public function handle($request, Closure $next, ...$guards)
{
    $this->authenticate($request, $guards);

    // 从数据库获取最新的用户信息(避免Session缓存旧Token)
    $user = Auth::user()->fresh();
    $sessionToken = $request->session()->get('remember_token');

    // 检查Token有效性
    if (!$sessionToken || $user->remember_token !== $sessionToken) {
        Auth::logout();
        $request->session()->invalidate();
        $request->session()->regenerateToken();
        
        return redirect()->route('Connection')->withErrors([
            'Votre session a expiré ou vous vous êtes connecté ailleurs.'
        ]);
    }

    return $next($request);
}

3. 确保中间件注册正确

检查app/Http/Kernel.php中的路由中间件配置,确认你的自定义中间件已正确注册(注意类名拼写,建议统一为Authenticate,避免拼写错误):

protected $routeMiddleware = [
    // ...
    'auth' => \App\Http\Middleware\Authenticate::class,
    // ...
];

4. 完善登出逻辑

在ConnectionController的登出方法中,彻底清除Session数据:

public function logout(Request $request)
{
    Auth::logout();
    $request->session()->invalidate();
    $request->session()->regenerateToken();
    
    return redirect()->route('Connection');
}

验证步骤

  1. 启动应用,尝试登录,观察数据库中remember_token是否正确更新
  2. 登录后跳转至ProgramView,检查是否不再被强制退回登录页
  3. 打开新标签页登录同一账号,返回旧标签页刷新,确认会触发"异地登录"提示并登出

内容的提问来源于stack exchange,提问作者Eloi Jahan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:44:57