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

Laravel 11中如何在自定义中间件中获取Auth::id()?

Laravel 11中间件中获取Auth::id()返回NULL的解决方法

问题原因

Laravel 11调整了中间件的默认执行顺序,控制器构造函数中注册的自定义中间件会优先于会话(StartSession)和认证(Authenticate)中间件执行。此时用户会话尚未初始化,因此Auth::id()会返回null,而旧版Laravel的执行顺序不同,所以之前能正常获取用户ID。

解决办法

1. 控制中间件执行顺序

在控制器构造函数中,先注册会话/认证相关中间件,再注册你的自定义中间件,确保依赖的组件先完成初始化:

public function __construct()
{
    // 若需要强制用户登录,先执行auth中间件
    $this->middleware('auth')->middleware('NewMiddleware');
    
    // 若无需强制登录,仅需会话初始化,可使用web中间件组
    // $this->middleware('web')->middleware('NewMiddleware');
}

2. 全局配置中间件优先级或分组

在bootstrap/app.php中,通过配置中间件组或优先级,确保自定义中间件在会话、认证中间件之后运行:

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        // 方式一:将自定义中间件加入web组(自动继承会话、认证中间件的执行顺序)
        $middleware->web([
            \App\Http\Middleware\NewMiddleware::class,
        ]);

        // 方式二:手动设置优先级,明确执行顺序
        $middleware->priority([
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\Auth\Middleware\Authenticate::class,
            \App\Http\Middleware\NewMiddleware::class,
        ]);
    })
    ->create();

3. 直接从请求实例获取用户

如果会话已初始化,也可以直接通过请求实例获取用户ID,效果与Auth::id()一致:

public function handle($request, Closure $next)
{
    $userId = $request->user()?->id;
    dd($userId);
    return $next($request);
}

内容的提问来源于stack exchange,提问作者UltraMarkus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 03:35:03