解決 Laravel JWT 多表認證時獲取不到當前認證使用者的問題

hackxiaoya發表於2020-10-28

問題描述

最近在做一個專案,需要多表認證,分別為adminuser表,我採用的JWT認證方式,但今天遇到了一個問題:使用Auth::user()返回null,也就是說無法獲得當前認證的使用者。

網上搜尋後,並沒有找到直接的解決方案,然後經過幾次嘗試居然誤打誤撞地解決了,所以特地記錄下來,希望遇到同樣問題的人不要再在這問題上耗費太多時間。

注意:這裡並不介紹JWT的工作原理和配置,如果想理解更多請參考以下文章:

大致配置

先講一下我的配置。

auth.php檔案如下:

return [

    'defaults' => [
        'guard' => env('AUTH_GUARD', 'admin'),
    ],

    'guards' => [
        'admin' => [
            'driver' => 'jwt',                           #### 更改為JWT驅動
            'provider' => 'admins',
        ],
        'user' => [
            'driver' => 'jwt',                           #### 更改為JWT驅動
            'provider' => 'users',
        ],
    ],

    'providers' => [
        'admins' => [
            'driver' => 'eloquent',
            'model'  => \App\Admin::class,        #### 指定用於token驗證的模型類
        ],
        'users' => [
            'driver' => 'eloquent',
            'model'  => \App\User::class,        #### 指定用於token驗證的模型類
        ],
    ],

    'passwords' => [
        //
    ],

];

問題的根源

auth.php中,我們有兩個guard,而預設的guard指向的是admin,這時候如果是user經過的驗證的話,是無法通過Auth::user()獲取到當前認證使用者資訊的。

解決方法

解決方法很簡單,只要使用Auth::guard('user')指明使用哪個guard即可,這裡我是通過公用的控制器中的一個方法:

public function getAuthUser($guard = 'admin'){
    return Auth::guard($guard)->user();
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章