<?php
declare(strict_types=1);
namespace App\EventListener;
use App\Entity\User\User;
use App\Exception\BannedUserException;
use Gesdinet\JWTRefreshTokenBundle\Model\RefreshTokenManagerInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class RequestListener
{
private TokenStorageInterface $tokenStorage;
private RefreshTokenManagerInterface $refreshTokenManager;
public function __construct(
RefreshTokenManagerInterface $refreshTokenManager,
TokenStorageInterface $tokenStorage
)
{
$this->refreshTokenManager = $refreshTokenManager;
$this->tokenStorage = $tokenStorage;
}
public function onKernelRequest(RequestEvent $event)
{
if (!$event->isMasterRequest()) {
return;
}
if (!$token = $this->tokenStorage->getToken()) {
return ;
}
if (!$token->isAuthenticated()) {
return ;
}
$user = $token->getUser();
if ($user instanceof User && $user->getIsBlocked()) {
$refresh = $this->refreshTokenManager->getLastFromUsername($user->getEmail());
if ($refresh) {
$this->refreshTokenManager->delete($refresh);
}
throw new BannedUserException('Данный пользователь заблокирован');
}
}
}