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'); }
验证步骤
- 启动应用,尝试登录,观察数据库中
remember_token是否正确更新 - 登录后跳转至
ProgramView,检查是否不再被强制退回登录页 - 打开新标签页登录同一账号,返回旧标签页刷新,确认会触发"异地登录"提示并登出
内容的提问来源于stack exchange,提问作者Eloi Jahan
相关产品推荐
相关产品推荐

