多用户模型 Laravel JWT Auth

Posted

技术标签:

【中文标题】多用户模型 Laravel JWT Auth【英文标题】:Multiple User Models Laravel JWT Auth 【发布时间】:2016-08-18 18:15:14 【问题描述】:

我必须在我的 eloquent 中使用模型:

用户 Office 用户

OfficeUser 在 JWT 配置中定义为标准模型。 现在我已经编写了一个中间件来验证它们中的每一个

授权用户:

public function handle($request, Closure $next)

    Config::set('auth.providers.users.model', \App\User::class);
    try 

        if (! $user = JWTAuth::parseToken()->authenticate()) 
            return response()->json(['user_not_found'], 404);
        

     catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) 

        return response()->json(['token_expired'], $e->getStatusCode());

     catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) 

        return response()->json(['token_invalid'], $e->getStatusCode());

     catch (Tymon\JWTAuth\Exceptions\JWTException $e) 

        return response()->json(['token_absent'], $e->getStatusCode());

    

    return $next($request);

authOffice用户

public function handle($request, Closure $next)

    try 

        if (! $user = JWTAuth::parseToken()->authenticate()) 
            return response()->json(['user_not_found'], 404);
        

     catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) 

        return response()->json(['token_expired'], $e->getStatusCode());

     catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) 

        return response()->json(['token_invalid'], $e->getStatusCode());

     catch (Tymon\JWTAuth\Exceptions\JWTException $e) 

        return response()->json(['token_absent'], $e->getStatusCode());

    

    return $next($request);

另外我为他们每个人都有一个登录功能:

登录用户

if ($user)
        if (Hash::check($request->password, $user->password)) 
            // grab credentials from the request
            $credentials = $request->only('email', 'password');

            try 
                // attempt to verify the credentials and create a token for the user
                Config::set('auth.providers.users.model', \App\User::class);
                if (! $token = JWTAuth::attempt($credentials)) 
                    return response()->json(['error' => 'invalid_credentials'], 401);
                
             catch (JWTException $e) 
                // something went wrong whilst attempting to encode the token
                return response()->json(['error' => 'could_not_create_token'], 500);
            

登录办公室用户

if ($user)
        if (Hash::check($request->password, $user->password)) 
            // grab credentials from the request
            $credentials = $request->only('email', 'password');

            try 
                // attempt to verify the credentials and create a token for the user
                Config::set('auth.providers.users.model', \App\OfficeUser::class);
                if (! $token = JWTAuth::attempt($credentials)) 
                    return response()->json(['error' => 'invalid_credentials'], 401);
                
             catch (JWTException $e) 
                // something went wrong whilst attempting to encode the token
                return response()->json(['error' => 'could_not_create_token'], 500);
            

不幸的是,当我登录并尝试调用 authUser 中间件后面的路由时,我得到一个“user_not_found”

有人知道为什么会这样吗? OfficeUser 身份验证工作正常

【问题讨论】:

【参考方案1】:

为发现此问题的任何人发帖

虽然不建议有两个用户表,但我有一个类似的要求,即与我们的一个客户设置 JWT。这就是我解决问题的方法。

无需对 `config/auth.php' 中的提供程序进行任何更改

'providers' => [
    'users' => [
        'driver' => 'eloquent',
           'model' => App\User::class,
     ],

]

在您的身份验证控制器中,通过设置动态修改提供者使用的模型

\Config::set('auth.providers.users.model', \App\Trainer::class);

示例代码

在 authenticate() 方法中

if ($credentials['user_type'] == 'consultant') 

\Config::set('auth.providers.users.model', \App\Trainer::class);

 else 
    \Config::set('auth.providers.users.model', \App\User::class);


//Find the user

//Create the token
if ($user) 
   $customClaims = ['user_type' => $credentials['user_type']];
   $token = JWTAuth::fromUser($user,$customClaims);
 else 
  return response()->json(['error' => 'invalid_credentials'], 401);

在解析令牌以验证用户身份时,您也必须这样做。示例代码

在 getAuthenticatedUser() 方法中

$payload = JWTAuth::parseToken()->getPayload();
$user_type = $payload->get('user_type');

if($user_type === 'consultant')
   \Config::set('auth.providers.users.model', \App\Trainer::class);
else
   \Config::set('auth.providers.users.model', \App\User::class);


if (!$user = JWTAuth::parseToken()->authenticate()) 
    return response()->json(['user_not_found'], 404);

【讨论】:

Ps:您应该覆盖控制器构造函数中的配置更改。【参考方案2】:

您可以如下更改每个控制器中的__construct 函数。以便 jwt 知道要验证哪个模型。

OfficeUserController

function __construct()

    Config::set('jwt.user', OfficeUser::class);
    Config::set('auth.providers', ['users' => [
            'driver' => 'eloquent',
            'model' => OfficeUser::class,
        ]]);

【讨论】:

以上是关于多用户模型 Laravel JWT Auth的主要内容,如果未能解决你的问题,请参考以下文章

Auth 尝试方法在 Laravel/Lumen + JWT + 用户自定义模型中如何工作

Laravel 和 jwt-auth。如何检查用户电子邮件是不是经过验证

Laravel 8 tymon/jwt-auth 使另一个用户的令牌无效

如何仅检查(状态)活动用户可以登录-JWT Auth-Laravel

Laravel 5.5 使用 Jwt-Auth 实现 API 用户认证

如何在 Laravel 和 Vue.js 中使用 jwt-auth 检查用户是不是经过身份验证