<?php
namespace Platform\SecurityBundle\Listeners;
use Platform\SecurityBundle\Controller\LoginController;
use Platform\SecurityBundle\Entity\Identity\Account;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* Class AccountStatus
* @package Platform\SecurityBundle\Listeners
*/
final class AccountStatusListener implements EventSubscriberInterface
{
/**
* @var TokenStorageInterface
*/
private TokenStorageInterface $storage;
/**
* @var RouterInterface
*/
private RouterInterface $router;
/**
* @param TokenStorageInterface $storage
* @param RouterInterface $router
*/
public function __construct(TokenStorageInterface $storage, RouterInterface $router)
{
$this->storage = $storage;
$this->router = $router;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['onKernelRequest'],
];
}
/**
* @param RequestEvent $event
*/
public function onKernelRequest(RequestEvent $event)
{
$token = $this->storage->getToken();
// check if user was deactivated
if ($token && $token->getUser()) {
/** @var UserInterface $user */
$user = $token->getUser();
/** @var Account $user */
if (($user instanceof Account) && $user->isActive() === false) {
// reset session data (logout)
$this->storage->setToken(null);
$event->getRequest()->getSession()->invalidate();
// redirect to login page
$event->setResponse(
new RedirectResponse(
$this->router->generate(LoginController::ROUTES__SELECT)
)
);
}
}
}
}