src/EventSubscriber/CheckVerifiedUserSubscriber.php line 33

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\User;
  4. use App\Security\AccountNotVerifiedAuthenticationException;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\Routing\RouterInterface;
  8. use Symfony\Component\Security\Http\Event\CheckPassportEvent;
  9. use Symfony\Component\Security\Http\Event\LoginFailureEvent;
  10. class CheckVerifiedUserSubscriber implements EventSubscriberInterface
  11. {
  12.     public function __construct(private RouterInterface $router)
  13.     {
  14.     }
  15.     public function onCheckPassportEvent(CheckPassportEvent $event): void
  16.     {
  17.         $passport $event->getPassport();
  18.         $user $passport->getUser();
  19.         if (!$user instanceof User) {
  20.             throw new \Exception('Unexpected user type');
  21.         }
  22.         if (!$user->isVerified()) {
  23.             throw new AccountNotVerifiedAuthenticationException();
  24.         }
  25.     }
  26.     public function onLoginFailure(LoginFailureEvent $event)
  27.     {
  28.         if (!$event->getException() instanceof AccountNotVerifiedAuthenticationException) {
  29.             return;
  30.         }
  31.         $request $event->getRequest();
  32.         $email $event->getPassport()->getUser()->getEmail();
  33.         $request->getSession()->set('non_verified_email'$email);
  34.         $response = new RedirectResponse(
  35.             $this->router->generate('app_verify_resend_email')
  36.         );
  37.         $event->setResponse($response);
  38.     }
  39.     public static function getSubscribedEvents(): array
  40.     {
  41.         return [
  42.             CheckPassportEvent::class => ['onCheckPassportEvent', -10],
  43.             LoginFailureEvent::class => 'onLoginFailure',
  44.         ];
  45.     }
  46. }