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

Laravel9升级11后Web路由中$request->user()与Auth::user()返回null

Laravel 9升级到11后Web路由中Auth::user()返回null问题

问题描述

将Laravel从9版本升级至11版本后,在Web路由对应的控制器中调用$request->user()和Auth::user()均返回null,当前使用php-open-source-saver/jwt-auth扩展做用户认证。


代码与配置详情

routes/web.php

Route::get('customer/{id}', [FrontendController::class, 'home']);

app/Http/Controllers/FrontendController.php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

public function home(Request $request)
{
    dd($request->user(), Auth::user());
}

bootstrap/app.php

->withRouting(
    web: __DIR__ . '/../routes/web.php',
    api: [
        __DIR__ . '/../routes/api/core.php',
        __DIR__ . '/../routes/api/user.php'
    ],
    commands: __DIR__ . '/../routes/console.php',
    health: '/up'
)
->withMiddleware(function (Middleware $middleware) {
    //dd($middleware->getMiddlewareGroups());
})
->withExceptions(function (Exceptions $exceptions) {
    //
})->create();

中间件组输出

执行dd($middleware->getMiddlewareGroups())得到的中间件配置:

"web" => [
    0 => "Illuminate\Cookie\Middleware\EncryptCookies",
    1 => "Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse",
    2 => "Illuminate\Session\Middleware\StartSession",
    3 => "Illuminate\View\Middleware\ShareErrorsFromSession",
    4 => "Illuminate\Foundation\Http\Middleware\ValidateCsrfToken",
    5 => "Illuminate\Routing\Middleware\SubstituteBindings",
],
"api" => [
    0 => "Illuminate\Routing\Middleware\SubstituteBindings"
]

配置文件

config/auth.php

'defaults' => [
    'guard' => 'api',
    'passwords' => 'users',
],

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

config/session.php

'driver' => 'file'

环境信息

项值
框架Laravel
框架版本11.x
PHP-Open-Source-Saver/jwt-auth2.7
PHP版本8.2

预期与实际结果

  • 预期结果:控制器中$request->user()或Auth::user()返回已登录用户实例
  • 实际结果:两者均返回null

问题排查与解决方法

1. 给Web路由添加JWT认证中间件

Laravel 11默认Web中间件组不包含JWT的认证逻辑,需要手动给Web组添加auth:api中间件,或者给单个路由指定:

// 方法1:全局给Web组添加中间件
// 在bootstrap/app.php的withMiddleware闭包中添加
$middleware->appendToGroup('web', 'auth:api');

// 方法2:给单个路由指定中间件
Route::get('customer/{id}', [FrontendController::class, 'home'])->middleware('auth:api');

2. 明确指定Guard获取用户

即使默认Guard是api,Web路由的Session中间件会优先尝试Session认证,可在控制器中直接指定使用api Guard:

// 方式1
$user = Auth::guard('api')->user();

// 方式2
$user = $request->user('api');

3. 确认JWT Token传递方式

JWT认证依赖请求头中的Authorization: Bearer {token},确保前端请求正确携带该头信息,后端能正常解析Token。

4. 验证JWT扩展的Laravel 11兼容性

确认php-open-source-saver/jwt-auth 2.7是否完全适配Laravel 11,可手动注册服务提供者确保加载正常:

// 在bootstrap/app.php中添加
->withProviders([
    PHPOpenSourceSaver\JWTAuth\Providers\LaravelServiceProvider::class,
])

5. 清除缓存

执行以下命令清除配置、路由缓存,避免旧配置干扰:

php artisan config:clear
php artisan route:clear
php artisan cache:clear

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:42:03