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

Laravel中JWT认证后无法通过Auth::user()获取用户数据求助

解决Laravel JWT认证下Auth::user()无法获取用户数据的问题

核心原因

Laravel默认的auth中间件基于Session认证体系,而你使用的JWT属于Token认证,两者驱动不匹配,导致Auth::user()无法正确读取认证用户信息。

解决步骤

1. 替换路由中间件

将路由组中的auth中间件改为auth:api,明确指定使用JWT驱动的API Guard:

Route::group(['middleware' => 'auth:api'], function () {
    Route::post('auth/update/professional', 'App\Http\Controllers\Api\UpdateController@updateToProfessional');
    Route::post('auth/update/user', 'App\Http\Controllers\Api\UpdateController@updateToUser');
    Route::post('auth/edit/data', 'App\Http\Controllers\Api\Auth\EditDataController@updateName');
    Route::post('auth/edit/phone/number', 'App\Http\Controllers\Api\Auth\EditDataController@updatePhoneNumber');
    Route::post('auth/edit/password', 'App\Http\Controllers\Api\Auth\EditDataController@updatePassword');
    Route::post('auth/forget/password', 'App\Http\Controllers\Api\Auth\ForgotPasswordController@submitForgetPasswordForm');
    Route::post('auth/reset/password', 'App\Http\Controllers\Api\Auth\ForgotPasswordController@submitResetPasswordForm');
    Route::post('create/order', 'App\Http\Controllers\Api\CustomerOrderController@create');
    Route::post('update/order', 'App\Http\Controllers\Api\CustomerOrderController@update');
    Route::post('delete/order', 'App\Http\Controllers\Api\CustomerOrderController@delete');
});

2. 确认Auth配置的Guard驱动

打开config/auth.php,检查guards配置,确保API Guard使用JWT驱动:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'jwt', // 此处必须设置为jwt
        'provider' => 'users',
    ],
],

3. 优化控制器用户获取逻辑

无需通过User::find(Auth::user()->id)二次查询,直接使用Auth::user()获取当前用户,同时增加空值判断避免报错:

class UpdateController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth:api'); // 同步修改控制器中间件为auth:api
    }

    public function updateToProfessional(Request $request)
    {
        $request->validate([
            'services' => ['required', 'string', 'max:255','exists:services'],
        ]);

        $user = Auth::user();
        if (!$user) {
            return response()->json(['error' => '用户未认证'], 401);
        }

        $user->removeRole('Regular User');
        $user->assignRole('Professional');

        return $user;
    }
}

4. 忽略laravel/ui安装提示

系统提示安装laravel/ui是因为默认auth::routes()依赖该包,但你已通过JWT自行实现认证路由,此提示可直接忽略,只需确保请求Header中携带正确的Authorization: Bearer {你的JWT Token}即可。

内容的提问来源于stack exchange,提问作者4ri37ix L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 00:40:18