src/EventSubscriber/CheckVerifiedUserSubscriber.php line 23

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\User;
  4. use Symfony\Component\Routing\RouterInterface;
  5. use Symfony\Component\HttpFoundation\RedirectResponse;
  6. use Symfony\Component\Security\Http\Event\LoginFailureEvent;
  7. use App\Controller\AccountNotVerifiedAuthenticationException;
  8. use Symfony\Component\Security\Http\Event\CheckPassportEvent;
  9. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
  12. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  13. use Symfony\Component\Security\Http\Authenticator\Passport\UserPassportInterface;
  14. use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
  15. class CheckVerifiedUserSubscriber implements EventSubscriberInterface
  16. {
  17.     private RouterInterface $router;
  18.     private FlashBagInterface $flashBag;
  19.     public function __construct(RouterInterface $routerSessionInterface $session)
  20.     {
  21.         $this->router $router;
  22.         $this->flashBag $session->getFlashBag();
  23.     }
  24.     public function onCheckPassport(CheckPassportEvent $event)
  25.     {
  26.        $passport $event->getPassport();
  27.         if (!$passport instanceof UserPassportInterface) {
  28.             throw new \Exception('Unexpected passport type');
  29.         }
  30.         $user $passport->getUser();
  31.         if (!$user instanceof User) {
  32.             throw new \Exception('Unexpected user type');
  33.         }
  34.         // Permet d'envoyer un message pour indiquer à l'User que son compte n'est pas vérifié
  35.         // if (!$user->getEmailVerified()) {
  36.         //     throw new CustomUserMessageAuthenticationException(
  37.         //         'Veuillez vérifier votre compte avant de vous connecter.'
  38.         //     );
  39.         // }
  40.         if (!$user->getEmailVerified()) {
  41.             throw new AccountNotVerifiedAuthenticationException();     
  42.         }
  43.         //Permet d'envoyer un message pour indiquer à l'User que son compte n'est pas activé
  44.         if (!$user->isActif()) {
  45.             throw new CustomUserMessageAuthenticationException(
  46.                 'Votre compte est désactivé. Veuillez contacter l\'administrateur du site pour l\'activation.'
  47.             );
  48.         }
  49.     }
  50.     public function onLoginFailure(LoginFailureEvent $event)
  51.     {
  52.         $userEmail$event->getPassport()->getUser()->getEmail();
  53.          if (!$event->getException() instanceof AccountNotVerifiedAuthenticationException) {
  54.             return;
  55.         }
  56.         $this->flashBag->add('info''Un email de confirmation vous a été envoyé pour la vérification de votre compte. Si le mail n\'apparait pas dans la boite de réception, veuillez verifier dans les spams!');
  57.         $response = new RedirectResponse(
  58.             $this->router->generate('app_verify_resend_email', ['email'=> $userEmail])
  59.         );
  60.         $event->setResponse($response);
  61.     }
  62.     public static function getSubscribedEvents()
  63.     {
  64.          return [
  65.             CheckPassportEvent::class => ['onCheckPassport', -10],
  66.             LoginFailureEvent::class => 'onLoginFailure',
  67.         ];
  68.     }
  69. }