src/Core/Application/EventSubscriber/Security/LoginSuccessSubscriber.php line 45

  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Core\Application\EventSubscriber\Security;
  4. use App\Core\Domain\Entity\Student\Student;
  5. use App\Core\Domain\Exception\InvalidStudentTokenException;
  6. use DateTimeImmutable;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Lexik\Bundle\JWTAuthenticationBundle\Event\AuthenticationSuccessEvent;
  9. use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTAuthenticatedEvent;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Symfony\Component\HttpFoundation\RequestStack;
  12. use Symfony\Component\Security\Http\Event\LoginSuccessEvent;
  13. use Symfony\Component\Uid\Uuid;
  14. class LoginSuccessSubscriber implements EventSubscriberInterface
  15. {
  16.     private EntityManagerInterface $em;
  17.     public function __construct(EntityManagerInterface $entityManager, private readonly RequestStack $requestStack)
  18.     {
  19.         $this->em $entityManager;
  20.     }
  21.     public static function getSubscribedEvents(): array
  22.     {
  23.         return [
  24.             'lexik_jwt_authentication.on_authentication_success' => 'onAuthenticationSuccessResponse',
  25.             'lexik_jwt_authentication.on_jwt_authenticated' => 'onJWTAuthenticated',
  26.             LoginSuccessEvent::class => 'onLoginSuccess'
  27.         ];
  28.     }
  29.     public function onLoginSuccess(LoginSuccessEvent $event): void
  30.     {
  31.         $user $event->getUser();
  32.         if (method_exists($user'setLastLoginDate')) {
  33.             $user->setLastLoginDate(new DateTimeImmutable());
  34.             $this->em->flush();
  35.         }
  36.     }
  37.     public function onJWTAuthenticated(JWTAuthenticatedEvent $event): void
  38.     {
  39.         $request $this->requestStack->getCurrentRequest();
  40.         if ($request !== null) {
  41.             /** @var Student $student */
  42.             $student $event->getToken()->getUser();
  43.             $token $request->headers->get('X-STUDENT-TOKEN');
  44.             if ($student->getStudentToken()->__toString() !== $token && $student->getStudentToken() !== null) {
  45.                 throw new InvalidStudentTokenException('The token is invalid.');
  46.             }
  47.         }
  48.     }
  49.     public function onAuthenticationSuccessResponse(AuthenticationSuccessEvent $event): void
  50.     {
  51.         /** @var Student $user */
  52.         $user $event->getUser();
  53.         $data $event->getData();
  54.         $token Uuid::v4();
  55.         $user->setStudentToken($token);
  56.         $data['studentToken'] = $user->getStudentToken()->__toString();
  57.         $event->setData($data);
  58.     }
  59. }