vendor/symfony/security-http/Firewall/AccessListener.php line 31
<?php/** This file is part of the Symfony package.** (c) Fabien Potencier <fabien@symfony.com>** For the full copyright and license information, please view the LICENSE* file that was distributed with this source code.*/namespace Symfony\Component\Security\Http\Firewall;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpKernel\Event\RequestEvent;use Symfony\Component\Security\Core\Authentication\Token\NullToken;use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter;use Symfony\Component\Security\Core\Exception\AccessDeniedException;use Symfony\Component\Security\Http\AccessMapInterface;use Symfony\Component\Security\Http\Event\LazyResponseEvent;/*** AccessListener enforces access control rules.** @author Fabien Potencier <fabien@symfony.com>** @final*/class AccessListener extends AbstractListener{private TokenStorageInterface $tokenStorage;private AccessDecisionManagerInterface $accessDecisionManager;private AccessMapInterface $map;public function __construct(TokenStorageInterface $tokenStorage, AccessDecisionManagerInterface $accessDecisionManager, AccessMapInterface $map, bool $exceptionOnNoToken = false){if (false !== $exceptionOnNoToken) {throw new \LogicException(sprintf('Argument $exceptionOnNoToken of "%s()" must be set to "false".', __METHOD__));}$this->tokenStorage = $tokenStorage;$this->accessDecisionManager = $accessDecisionManager;$this->map = $map;}public function supports(Request $request): ?bool{[$attributes] = $this->map->getPatterns($request);$request->attributes->set('_access_control_attributes', $attributes);if ($attributes && [AuthenticatedVoter::PUBLIC_ACCESS] !== $attributes) {return true;}return null;}/*** Handles access authorization.** @throws AccessDeniedException*/public function authenticate(RequestEvent $event){$request = $event->getRequest();$attributes = $request->attributes->get('_access_control_attributes');$request->attributes->remove('_access_control_attributes');if (!$attributes || ([AuthenticatedVoter::PUBLIC_ACCESS] === $attributes && $event instanceof LazyResponseEvent)) {return;}$token = $this->tokenStorage->getToken() ?? new NullToken();if (!$this->accessDecisionManager->decide($token, $attributes, $request, true)) {throw $this->createAccessDeniedException($request, $attributes);}}private function createAccessDeniedException(Request $request, array $attributes){$exception = new AccessDeniedException();$exception->setAttributes($attributes);$exception->setSubject($request);return $exception;}public static function getPriority(): int{return -255;}}