vendor/api-platform/core/src/Symfony/EventListener/DenyAccessListener.php line 39

  1. <?php
  2. /*
  3.  * This file is part of the API Platform project.
  4.  *
  5.  * (c) Kévin Dunglas <dunglas@gmail.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. declare(strict_types=1);
  11. namespace ApiPlatform\Symfony\EventListener;
  12. use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
  13. use ApiPlatform\Symfony\Security\ResourceAccessCheckerInterface;
  14. use ApiPlatform\Util\OperationRequestInitiatorTrait;
  15. use ApiPlatform\Util\RequestAttributesExtractor;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpKernel\Event\RequestEvent;
  18. use Symfony\Component\HttpKernel\Event\ViewEvent;
  19. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  20. /**
  21.  * Denies access to the current resource if the logged user doesn't have sufficient permissions.
  22.  *
  23.  * @author Kévin Dunglas <dunglas@gmail.com>
  24.  */
  25. final class DenyAccessListener
  26. {
  27.     use OperationRequestInitiatorTrait;
  28.     public function __construct(?ResourceMetadataCollectionFactoryInterface $resourceMetadataCollectionFactory null, private readonly ?ResourceAccessCheckerInterface $resourceAccessChecker null)
  29.     {
  30.         $this->resourceMetadataCollectionFactory $resourceMetadataCollectionFactory;
  31.     }
  32.     public function onSecurity(RequestEvent $event): void
  33.     {
  34.         $this->checkSecurity($event->getRequest(), 'security');
  35.     }
  36.     public function onSecurityPostDenormalize(RequestEvent $event): void
  37.     {
  38.         $request $event->getRequest();
  39.         $this->checkSecurity($request'security_post_denormalize', [
  40.             'previous_object' => $request->attributes->get('previous_data'),
  41.         ]);
  42.     }
  43.     public function onSecurityPostValidation(ViewEvent $event): void
  44.     {
  45.         $request $event->getRequest();
  46.         $this->checkSecurity($request'security_post_validation', [
  47.             'previous_object' => $request->attributes->get('previous_data'),
  48.         ]);
  49.     }
  50.     /**
  51.      * @throws AccessDeniedException
  52.      */
  53.     private function checkSecurity(Request $requeststring $attribute, array $extraVariables = []): void
  54.     {
  55.         if (!$this->resourceAccessChecker || !$attributes RequestAttributesExtractor::extractAttributes($request)) {
  56.             return;
  57.         }
  58.         $operation $this->initializeOperation($request);
  59.         if (!$operation) {
  60.             return;
  61.         }
  62.         switch ($attribute) {
  63.             case 'security_post_denormalize':
  64.                 $isGranted $operation->getSecurityPostDenormalize();
  65.                 $message $operation->getSecurityPostDenormalizeMessage();
  66.                 break;
  67.             case 'security_post_validation':
  68.                 $isGranted $operation->getSecurityPostValidation();
  69.                 $message $operation->getSecurityPostValidationMessage();
  70.                 break;
  71.             default:
  72.                 $isGranted $operation->getSecurity();
  73.                 $message $operation->getSecurityMessage();
  74.         }
  75.         if (null === $isGranted) {
  76.             return;
  77.         }
  78.         $extraVariables += $request->attributes->all();
  79.         $extraVariables['object'] = $request->attributes->get('data');
  80.         $extraVariables['previous_object'] = $request->attributes->get('previous_data');
  81.         $extraVariables['request'] = $request;
  82.         if (!$this->resourceAccessChecker->isGranted($attributes['resource_class'], $isGranted$extraVariables)) {
  83.             throw new AccessDeniedException($message ?? 'Access Denied.');
  84.         }
  85.     }
  86. }