<?php
declare(strict_types=1);
namespace App\EventSubscriber;
use App\Entity\Security\User;
use App\Service\Session\SessionService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
use Symfony\Component\Security\Http\Authenticator\Passport\UserPassportInterface;
use Symfony\Component\Security\Http\Event\CheckPassportEvent;
class CheckVerifiedUserSubscriber implements EventSubscriberInterface
{
public function __construct(
private SessionService $sessionService,
) {
}
public function onCheckPassport(CheckPassportEvent $event): void
{
$passport = $event->getPassport();
if (!$passport instanceof UserPassportInterface) {
throw new \Exception('Unexpected passport type', Response::HTTP_BAD_REQUEST);
}
$user = $passport->getUser();
if (!$user instanceof User) {
throw new \Exception('Unexpected user type', Response::HTTP_BAD_REQUEST);
}
if (!$user->isVerified()) {
throw new CustomUserMessageAuthenticationException(
'Veuillez activer votre compte avant de vous connecter.',
[],
Response::HTTP_BAD_REQUEST
);
}
$this->sessionService->switchUser($user);
}
public static function getSubscribedEvents()
{
return [
CheckPassportEvent::class => ['onCheckPassport', -10],
];
}
}