php - 多用户模型 Laravel JWT Auth

标签 php laravel jwt

我必须用我的 Eloquent 来表达用户模型:

  • 用户
  • 办公用户

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

authOfficeUser

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

登录Office用户

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 身份验证工作正常

最佳答案

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

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

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

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

]

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

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

在解析 token 以对用户进行身份验证时,您也必须执行相同的操作。示例代码

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

关于php - 多用户模型 Laravel JWT Auth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36839158/

相关文章:

php - 在不使用 eval() 的情况下找到字符串方程的答案

laravel - vagrant/homestead/windows : EPROTO: protocol error, 符号链接(symbolic link)上的 npm 安装错误

javascript - 使 JSON Web token 无效

java - 从 android 发送时 token 显示已过期

php - 使变量在所有 Controller 中可用

spring - postman 中不支持的媒体类型

php - 如何获得带有中文的 preg_match 2 位点(可选)?

php - 使用 PHP 读取 XLS 文件时的字符编码问题

php - 一天租一个街区的预订系统

Laravel 广播不写入 redis 但直接调用 redis 工作