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

Laravel中间件无法获取已认证用户数据返回Null的问题求助

问题排查与解决方案

核心问题定位

你把CheckUserRole中间件放到了全局中间件栈($middleware数组)里,而Laravel的全局中间件会在路由中间件组(比如web里的StartSession)之前执行。这时候会话还没启动,SessionGuard无法从会话中读取用户认证信息,所以auth()->check()返回false,自然拿不到用户数据。

同时,你的路由里虽然加了auth中间件,但全局的CheckUserRole先执行,这时候还没经过认证流程,导致中间件逻辑失效。

修复步骤

  • 移除全局中间件中的CheckUserRole
    打开app/Http/Kernel.php,把\App\Http\Middleware\CheckUserRole::class从$middleware数组中删除,只保留在$middlewareAliases里的别名配置即可。修改后的$middleware数组应该是:

    protected $middleware = [
        // \App\Http\Middleware\TrustHosts::class,
        \App\Http\Middleware\TrustProxies::class,
        \Illuminate\Http\Middleware\HandleCors::class,
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        // 移除这一行:\App\Http\Middleware\CheckUserRole::class,
        \App\Http\Middleware\CheckParticipantPhase::class,
    ];
    
  • 确认路由中间件顺序
    你的路由配置已经把check.user.role放在auth中间件组内部,这个顺序是对的——先经过auth认证,再执行角色校验。保持现有路由配置即可:

    Route::middleware(['auth'])->group(function () { 
        // Admin routes
        Route::middleware(['check.user.role'])->prefix('admin')->group(function () {
            Route::resource('psycological-test', PsychologicalTestController::class);
            Route::resource('profile', ProfileController::class);
            Route::resource('task', TaskController::class, ['as' => 'admin']);
            Route::resource('capsule', CapsuleController::class);
        });
    });
    
  • 恢复Authenticate中间件的redirectTo方法
    你注释了redirectTo的返回逻辑,导致未认证用户无法跳转到登录页,这会影响测试。恢复代码:

    protected function redirectTo(Request $request): ?string
    {
        return $request->expectsJson() ? null : route('login');
    }
    

验证修复

重新运行项目,访问admin路由时,CheckUserRole中间件会在auth之后执行,此时会话已启动,auth()->check()会返回true,可以正常获取用户数据。

额外注意点

  • 所有依赖会话或用户认证的中间件,都应该作为路由中间件(通过别名或直接类名绑定到路由/路由组),而不是全局中间件。
  • 全局中间件只适合处理所有请求都需要的基础逻辑(比如请求大小校验、字符串处理等),不要放需要认证的逻辑。

内容的提问来源于stack exchange,提问作者Alejandro V.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:35:19