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

