Laravel中间件中获取Auth用户为null的问题排查求助
Auth::user()返回null的问题 从你的配置和代码来看,问题核心在于认证流程没有在admin中间件之前完成执行,或是路由所属的中间件组缺少必要的认证/会话支持,下面是具体的排查和解决思路:
1. 确保认证中间件先于admin中间件执行
你的AdminMiddleware依赖已认证的用户对象,所以必须让系统先完成认证,再进入权限校验逻辑。当前你的路由仅绑定了admin中间件,跳过了认证步骤:
Route::get('show/question', 'APIController@getQuestion')->name('getQuestion')->middleware('admin');
解决方法:
根据你使用的认证方式调整路由中间件顺序:
- 如果是Session认证(Web端):
Route::get('show/question', 'APIController@getQuestion')->name('getQuestion')->middleware(['auth', 'admin']); - 如果是JWT认证(API端):
Route::get('show/question', 'APIController@getQuestion')->name('getQuestion')->middleware(['jwt.auth', 'admin']);
这样就能保证在进入admin中间件前,系统已经完成用户认证,Auth::user()自然能获取到有效对象。
2. 检查路由所属的中间件组
如果你的路由定义在routes/api.php中,它默认使用api中间件组,但这个组里没有包含Session相关的中间件:
'api' => [ 'throttle:100000,1', 'bindings', \Barryvdh\Cors\HandleCors::class, ],
如果你用的是Session驱动的认证(比如Web端账号密码登录),API路由默认不会处理会话,也就无法获取到已认证用户。
解决方法:
- 若需要在API路由中使用Session认证,给
api中间件组添加Session相关依赖:'api' => [ 'throttle:100000,1', 'bindings', \Barryvdh\Cors\HandleCors::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, ], - 或者直接把路由移到
routes/web.php中,自动继承web中间件组的Session支持。
3. 确认认证驱动配置
你配置了JWT的jwt.auth中间件,需要确保默认认证驱动与使用场景匹配:
打开config/auth.php,检查defaults和guards配置:
'defaults' => [ 'guard' => 'api', // 若用JWT,默认guard应设为api 'passwords' => 'users', ], 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'jwt', // 确保api guard的驱动是jwt 'provider' => 'users', 'hash' => false, ], ],
如果默认guard是web(Session驱动),但你在API路由中用JWT,也可以在AdminMiddleware中手动指定guard:
// 在AdminMiddleware的handle方法中 $user = Auth::guard('api')->user(); dd($user);
4. 验证中间件优先级(可选)
虽然路由中间件的顺序优先级更高,但你可以把AdminMiddleware加入middlewarePriority,确保它在认证中间件之后执行:
protected $middlewarePriority = [ \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\Authenticate::class, \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \Illuminate\Auth\Middleware\Authorize::class, \App\Http\Middleware\AdminMiddleware::class, // 添加到认证中间件之后 ];
不过这一步不是必须的,只要路由里的中间件顺序正确,优先级配置可以不用调整。
建议先从第一步调整路由中间件顺序开始测试,这是最常见的触发原因。如果问题依然存在,再依次排查后面的配置项。
内容的提问来源于stack exchange,提问作者floreapaun

