通过jwt中间件的请求将用户对象传递给控制器​​?

时间:2018-12-26 12:54:16

标签: php laravel request jwt middleware

我有一个简单的案例,需要您的建议。我正在使用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())中执行类似的操作,但是控制器构造函数在中间件之前执行,因此这是有问题的。因此,如果通过用户模型是一个好主意,请向我提供您的想法和建议。

1 个答案:

答案 0 :(得分:1)

这是一个自以为是的问题,所以不要以我的回答作为您的最终解决方案。

我使用Slim制作了一个身份验证中间件,该中间件将用户对象添加到请求属性中。本质上,这就是您在做什么。

请记住以下问题(至少对于不可变的请求/响应对象(如PSR7)):

  1. 当您在身份验证中间件之前拥有中间件(例如捕获异常)时,该请求就没有用户对象,因为中间件是分层工作的。
  2. 反之亦然:如果您拥有首先执行所有其他中间件然后执行自身的中间件

这只是伪代码,但您明白了。

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