src/EventSubscriber/CheckVerifiedUserSubscriber.php line 35

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\Authenticator\Passport\Passport;
  9. use Symfony\Component\Security\Http\Event\CheckPassportEvent;
  10. use Symfony\Component\Security\Http\Event\LoginFailureEvent;
  11. class CheckVerifiedUserSubscriber implements EventSubscriberInterface 
  12. {
  13.     private RouterInterface $router;
  14.     
  15.     /**
  16.      * __construct
  17.      *
  18.      * @param  mixed $router
  19.      * @return void
  20.      */
  21.     public function __construct(RouterInterface $router)
  22.     {
  23.         $this->router $router;        
  24.     }
  25.     
  26.     /**
  27.      * onCheckPassport
  28.      *
  29.      * @param  mixed $event
  30.      * @return void
  31.      */
  32.     public function onCheckPassport(CheckPassportEvent $event
  33.     {
  34.         $passport $event->getPassport();
  35.         if (!$passport instanceof Passport) {
  36.             throw new \Exception('Unexpected passport type');
  37.         }
  38.         $user $passport->getUser();
  39.         if (!$user instanceof User) {
  40.             throw new \Exception('Unexpected user type');
  41.         }
  42.         if (!$user->getIsVerified()) {
  43.             throw new AccountNotVerifiedAuthenticationException();
  44.         }
  45.     }
  46.     
  47.     /**
  48.      * onLoginFailure
  49.      *
  50.      * @param  mixed $event
  51.      * @return void
  52.      */
  53.     public function onLoginFailure(LoginFailureEvent $event)
  54.     {
  55.         if (!$event->getException() instanceof AccountNotVerifiedAuthenticationException) {
  56.             return;
  57.         }
  58.         $response = new RedirectResponse(
  59.             $this->router->generate('app_verify_resend_email')
  60.         );
  61.         $event->setResponse($response);
  62.     }
  63.         
  64.     /**
  65.      * getSubscribedEvents
  66.      *
  67.      * @return void
  68.      */
  69.     public static function getSubscribedEvents()
  70.     {
  71.         return [
  72.             CheckPassportEvent::class =>['onCheckPassport', -10],
  73.             LoginFailureEvent::class =>['onLoginFailure']
  74.         ];
  75.     }
  76. }