<?php
namespace App\EventListener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\HttpKernel\Event\RequestEvent;
class DynamicAccessSubscriber implements EventSubscriberInterface
{
private $checker;
private $tokenStorage;
public function __construct(AuthorizationCheckerInterface $checker, TokenStorageInterface $tokenStorage)
{
$this->checker = $checker;
$this->tokenStorage = $tokenStorage;
}
public static function getSubscribedEvents(): array
{
return [
RequestEvent::class => "onKernelRequest",
];
}
public function onKernelRequest(RequestEvent $event)
{
if(!$event->isMasterRequest()) {
return;
}
if($this->tokenStorage->getToken() === null) {
return;
}
if($this->checker->isGranted("", $event->getRequest())) {
return;
}
$exception = new AccessDeniedException("Access Denied.");
throw $exception;
}
}