我有一个简单的案例,需要您的建议。我正在使用tymon jwt软件包。我有JWT中间件,这是其代码的一部分:
$user = JWTAuth::parseToken()->authenticate();
if(!$user){
return response()->json(['message'=>trans("responseMessages.user_not_exists")], 403);
}
$request->request->set('user', $user);
此中间件的作用是尝试从给定的jwt令牌创建$ user,如果成功,则user可以继续。所以这是我的问题,在这段代码(最后一行)中,我通过请求将用户对象传递给控制器,因此我可以直接访问控制器中的用户模型。我只是有兴趣,这是个好主意吗?也许这会有问题吗?
另一种选择是在控制器功能中写入$user = JWTAuth::toUser(JWTAuth::getToken())
或通过请求而不是整个模型传递用户ID。但是在这些情况下,为了获得用户对象,我在中间件和控制器中两次与数据库通信。
我也尝试在控制器构造函数$this->user = JWTAuth::toUser(JWTAuth::getToken())
中执行类似的操作,但是控制器构造函数在中间件之前执行,因此这是有问题的。因此,如果通过用户模型是一个好主意,请向我提供您的想法和建议。
答案 0 :(得分:1)
这是一个自以为是的问题,所以不要以我的回答作为您的最终解决方案。
我使用Slim制作了一个身份验证中间件,该中间件将用户对象添加到请求属性中。本质上,这就是您在做什么。
请记住以下问题(至少对于不可变的请求/响应对象(如PSR7)):
这只是伪代码,但您明白了。
middlewarefunction($request, $response, $nextmiddleware)
{
$nextmiddleware->do($request, $response);
// from here on the $request has nothing set to the request by the $nextMiddleware
// because it is immutable
}
//编辑 如果您查看其他中间件,它们也使用解码的JWT令牌设置了request属性: https://github.com/DASPRiD/Helios/blob/master/src/IdentityMiddleware.php https://github.com/tuupola/slim-jwt-auth/blob/3.x/src/JwtAuthentication.php