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

中间件失效触发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();
错误截图

ERR_TOO_MANY_REDIRECTS错误截图

问题分析与修复方案

循环重定向根源

  1. 全局挂载NewPassword中间件后,所有请求都会经过它。新用户被重定向到password路由时,该路由同样触发中间件,再次检测到new_user状态,又重定向回去,形成无限循环。
  2. Auth::check()失效是因为中间件执行顺序问题:NewPassword在认证中间件之前运行,此时用户还未完成认证,导致Auth::check()始终返回false;而后续认证通过后,又会触发中间件逻辑,进一步加剧循环。

具体修复步骤

  1. 避免全局挂载,排除目标路由
    修改App.php中的中间件配置,给NewPassword中间件排除password相关路由,防止进入循环:

    ->withMiddleware(function (Middleware $middleware) {
        $middleware->append(NewPassword::class)->except(['password', 'password.*']);
        $middleware->alias([
            '2fa' => \App\Http\Middleware\LoginSecurityMiddleware::class,
        ]);
    })
    
  2. 调整中间件执行顺序
    确保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,
        ]);
    })
    
  3. 优化中间件逻辑,增加路由判断
    在中间件里添加当前路由的判断,避免重复重定向到目标路由:

    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:59:49