src/Service/JWTDataExtender.php line 36

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use App\Entity\User;
  4. use JMS\Serializer\ArrayTransformerInterface;
  5. use JMS\Serializer\SerializationContext;
  6. use JMS\Serializer\SerializerInterface;
  7. use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTCreatedEvent;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. use Symfony\Component\Security\Core\User\UserInterface;
  10. /**
  11.  * Class JWTDataExtender is used to add additional information into JWT token itself
  12.  * related to User entity serialisation config ( all fields marked by "token" group)
  13.  * @package App\EventListener
  14.  */
  15. class JWTDataExtender
  16. {
  17.     const REMEMBER_ME_EXPIRATION_DAYS 30;
  18.     /** @var ArrayTransformerInterface */
  19.     private $transformer;
  20.     /**
  21.      * @var RequestStack
  22.      */
  23.     private $requestStack;
  24.     public function __construct(ArrayTransformerInterface $transformerRequestStack $requestStack)
  25.     {
  26.         /** @var SerializerInterface serializer */
  27.         $this->transformer $transformer;
  28.         $this->requestStack $requestStack;
  29.     }
  30.     public function onCreated(JWTCreatedEvent $event)
  31.     {
  32.         $data $event->getData();
  33.         $user $event->getUser();
  34.         if (!$user instanceof UserInterface) {
  35.             return;
  36.         }
  37.         $this->rememberMe($data);
  38.         $this->addImpersonator($user$data);
  39.         $context SerializationContext::create()
  40.             ->setGroups('token');
  41.         $serialized $this->transformer->toArray($user$context);
  42.         $data array_merge($data$serialized);
  43.         $event->setData($data);
  44.     }
  45.     private function rememberMe(array &$data)
  46.     {
  47.         $request $this->requestStack->getCurrentRequest();
  48.         if ($request->getContentType() === 'json') {
  49.             $requestData json_decode($request->getContent(), true);
  50.             if (!empty($requestData['remember_me']) && $requestData['remember_me']) {
  51.                 $expiration = new \DateTime('+' self::REMEMBER_ME_EXPIRATION_DAYS ' days');
  52.                 $data['exp'] = $expiration->getTimestamp();
  53.             }
  54.         }
  55.     }
  56.     private function addImpersonator(User $user, array &$data)
  57.     {
  58.         if (!is_null($user->getImpersonatorId())) {
  59.             $data['impersonator_id'] = $user->getImpersonatorId();
  60.         }
  61.     }
  62. }