<?php
namespace App\EventSubscriber;
use App\Entity\AuthUser;
use App\Service\App\ToolsService;
use Doctrine\ORM\EntityManagerInterface;
use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTInvalidEvent;
use Lexik\Bundle\JWTAuthenticationBundle\Response\JWTAuthenticationFailureResponse;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class JWTInvalidSubscriber implements EventSubscriberInterface
{
/** @var EntityManagerInterface $em */
private EntityManagerInterface $em;
/** @var RequestStack $requestStack */
private RequestStack $requestStack;
/** @var ToolsService $toolsService */
private ToolsService $toolsService;
public static function getSubscribedEvents(): array
{
return [
'lexik_jwt_authentication.on_jwt_invalid' => 'onJWTInvalid'
];
}
public function __construct(
RequestStack $requestStack,
EntityManagerInterface $em,
ToolsService $toolsService
)
{
$this->requestStack = $requestStack;
$this->em = $em;
$this->toolsService = $toolsService;
}
/**
* @param JWTInvalidEvent $event
*/
public function onJWTInvalid(JWTInvalidEvent $event)
{
$request = $this->requestStack->getCurrentRequest();
/** @var string $token */
$token = substr($request->headers->get('authorization'), 7);
$jwtPayload = $this->toolsService->getPayloadFromJwtToken($token);
/** @var AuthUser $user */
$user = $this->em->getRepository(AuthUser::class)->findOneBy(['email' => $jwtPayload->username]);
if (true === $user->getIsBlocked()) {
$response = new JWTAuthenticationFailureResponse('Your account is blocked !');
$event->setResponse($response);
}
}
}