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.
相关产品推荐
相关产品推荐

