Передать пользовательский объект в контроллер через запрос от промежуточного ПО jwt? - PullRequest
0 голосов
/ 26 декабря 2018

У меня простой случай, и мне нужен твой совет.Я использую пакет Tymon JWT.У меня есть промежуточное ПО JWT, и это часть его кода:

     $user = JWTAuth::parseToken()->authenticate();
     if(!$user){
         return response()->json(['message'=>trans("responseMessages.user_not_exists")], 403);
     }
     $request->request->set('user', $user);

то, что делает это промежуточное ПО, заключается в том, что оно пытается создать $ user из заданного токена jwt, и в случае успеха пользователь может продолжить.так вот мой вопрос, в этом коде (последняя строка) я передаю пользовательский объект в контроллер через запрос, чтобы я мог иметь прямой доступ к пользовательской модели в контроллере.Мне просто интересно, это хорошая идея?или может это будет проблематично?

другой вариант - записать $user = JWTAuth::toUser(JWTAuth::getToken()) в функции контроллера или передать идентификатор пользователя через запрос вместо всей модели.но в этих случаях я дважды общаюсь с базой данных, в промежуточном программном обеспечении и в контроллере, чтобы получить объект пользователя.

также я пытался сделать что-то подобное в конструкторе контроллера: $this->user = JWTAuth::toUser(JWTAuth::getToken()), но конструктор контроллера выполняется до промежуточного программного обеспечения, так что это было проблематично.так что дайте мне ваши идеи и советы, если прохождение модели пользователя является хорошей идеей или нет.

1 Ответ

0 голосов
/ 26 декабря 2018

Это взвешенный вопрос, поэтому не принимайте мой ответ как окончательное решение.

Я использую 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: https://github.com/DASPRiD/Helios/blob/master/src/IdentityMiddleware.php https://github.com/tuupola/slim-jwt-auth/blob/3.x/src/JwtAuthentication.php

...