多个用户模型 Laravel JWT 身份验证


Multiple User Models Laravel JWT Auth

我必须用我的雄辩来用户模型:

  • 用户
  • 办公室用户

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);
}

身份验证办公室用户

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"

有人知道为什么会这样吗?办公室用户身份验证工作正常

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

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

无需在"配置/身份验证.php中对提供程序进行任何更改

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

在身份验证控制器中,通过设置

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

示例代码

In 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);
}
您可以

更改每个控制器中的__construct函数,如下所示。以便 jwt 知道要对哪个模型进行身份验证。

办公室用户控制器

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