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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:43:59