<?php
namespace App\EventSubscriber;
use App\Entity\User;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Http\Event\LoginFailureEvent;
use App\Controller\AccountNotVerifiedAuthenticationException;
use Symfony\Component\Security\Http\Event\CheckPassportEvent;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Http\Authenticator\Passport\UserPassportInterface;
use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
class CheckVerifiedUserSubscriber implements EventSubscriberInterface
{
private RouterInterface $router;
private FlashBagInterface $flashBag;
public function __construct(RouterInterface $router, SessionInterface $session)
{
$this->router = $router;
$this->flashBag = $session->getFlashBag();
}
public function onCheckPassport(CheckPassportEvent $event)
{
$passport = $event->getPassport();
if (!$passport instanceof UserPassportInterface) {
throw new \Exception('Unexpected passport type');
}
$user = $passport->getUser();
if (!$user instanceof User) {
throw new \Exception('Unexpected user type');
}
// Permet d'envoyer un message pour indiquer à l'User que son compte n'est pas vérifié
// if (!$user->getEmailVerified()) {
// throw new CustomUserMessageAuthenticationException(
// 'Veuillez vérifier votre compte avant de vous connecter.'
// );
// }
if (!$user->getEmailVerified()) {
throw new AccountNotVerifiedAuthenticationException();
}
//Permet d'envoyer un message pour indiquer à l'User que son compte n'est pas activé
if (!$user->isActif()) {
throw new CustomUserMessageAuthenticationException(
'Votre compte est désactivé. Veuillez contacter l\'administrateur du site pour l\'activation.'
);
}
}
public function onLoginFailure(LoginFailureEvent $event)
{
$userEmail= $event->getPassport()->getUser()->getEmail();
if (!$event->getException() instanceof AccountNotVerifiedAuthenticationException) {
return;
}
$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!');
$response = new RedirectResponse(
$this->router->generate('app_verify_resend_email', ['email'=> $userEmail])
);
$event->setResponse($response);
}
public static function getSubscribedEvents()
{
return [
CheckPassportEvent::class => ['onCheckPassport', -10],
LoginFailureEvent::class => 'onLoginFailure',
];
}
}