中间件失效触发ERR_TOO_MANY_REDIRECTS:Auth::check()无法识别已登录用户
问题描述
中间件无法正常运行,触发ERR_TOO_MANY_REDIRECTS错误,核心问题是Auth::check()无法识别已登录用户。
相关代码
中间件代码
public function handle(Request $request, Closure $next): Response { if (Auth::check()) { try { if ($request->user()->new_user) { return redirect()->route('password'); } } catch (\Exception $e) {} } return $next($request); }
App.php配置代码
->withMiddleware(function (Middleware $middleware) { $middleware->append(NewPassword::class); $middleware->alias([ '2fa' => \App\Http\Middleware\LoginSecurityMiddleware::class, ]); }) ->withExceptions(function (Exceptions $exceptions) { // })->create();
错误截图

问题分析与修复方案
循环重定向根源
- 全局挂载
NewPassword中间件后,所有请求都会经过它。新用户被重定向到password路由时,该路由同样触发中间件,再次检测到new_user状态,又重定向回去,形成无限循环。 Auth::check()失效是因为中间件执行顺序问题:NewPassword在认证中间件之前运行,此时用户还未完成认证,导致Auth::check()始终返回false;而后续认证通过后,又会触发中间件逻辑,进一步加剧循环。
具体修复步骤
避免全局挂载,排除目标路由
修改App.php中的中间件配置,给NewPassword中间件排除password相关路由,防止进入循环:->withMiddleware(function (Middleware $middleware) { $middleware->append(NewPassword::class)->except(['password', 'password.*']); $middleware->alias([ '2fa' => \App\Http\Middleware\LoginSecurityMiddleware::class, ]); })调整中间件执行顺序
确保Laravel自带的认证中间件(Authenticate)在NewPassword之前运行,这样Auth::check()才能正确获取用户登录状态:->withMiddleware(function (Middleware $middleware) { $middleware->prepend(\App\Http\Middleware\Authenticate::class); $middleware->append(NewPassword::class)->except(['password']); $middleware->alias([ '2fa' => \App\Http\Middleware\LoginSecurityMiddleware::class, ]); })优化中间件逻辑,增加路由判断
在中间件里添加当前路由的判断,避免重复重定向到目标路由:public function handle(Request $request, Closure $next): Response { if (Auth::check()) { try { $user = $request->user(); if ($user->new_user && !$request->routeIs('password')) { return redirect()->route('password'); } } catch (\Exception $e) {} } return $next($request); }
内容的提问来源于stack exchange,提问作者jere rosas
相关产品推荐
相关产品推荐

