<?php
namespace App\EventSubscriber;
use App\Entity\User;
use App\Security\AccountNotVerifiedAuthenticationException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
use Symfony\Component\Security\Http\Event\CheckPassportEvent;
use Symfony\Component\Security\Http\Event\LoginFailureEvent;
class CheckVerifiedUserSubscriber implements EventSubscriberInterface
{
private RouterInterface $router;
/**
* __construct
*
* @param mixed $router
* @return void
*/
public function __construct(RouterInterface $router)
{
$this->router = $router;
}
/**
* onCheckPassport
*
* @param mixed $event
* @return void
*/
public function onCheckPassport(CheckPassportEvent $event)
{
$passport = $event->getPassport();
if (!$passport instanceof Passport) {
throw new \Exception('Unexpected passport type');
}
$user = $passport->getUser();
if (!$user instanceof User) {
throw new \Exception('Unexpected user type');
}
if (!$user->getIsVerified()) {
throw new AccountNotVerifiedAuthenticationException();
}
}
/**
* onLoginFailure
*
* @param mixed $event
* @return void
*/
public function onLoginFailure(LoginFailureEvent $event)
{
if (!$event->getException() instanceof AccountNotVerifiedAuthenticationException) {
return;
}
$response = new RedirectResponse(
$this->router->generate('app_verify_resend_email')
);
$event->setResponse($response);
}
/**
* getSubscribedEvents
*
* @return void
*/
public static function getSubscribedEvents()
{
return [
CheckPassportEvent::class =>['onCheckPassport', -10],
LoginFailureEvent::class =>['onLoginFailure']
];
}
}