多用户模型 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