src/Security/CrudVoter.php line 26

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by IntelliJ IDEA.
  4.  * User: dogukan
  5.  * Date: 2019-01-27
  6.  * Time: 18:21
  7.  */
  8. namespace App\Security;
  9. use App\Entity\Role;
  10. use App\Entity\Route;
  11. use App\Service\SessionService;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Psr\Cache\CacheItemPoolInterface;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\RequestStack;
  16. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  17. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  18. use Symfony\Component\Security\Core\Security;
  19. /**
  20.  * Class CrudVoter
  21.  * @package App\Security
  22.  */
  23. class CrudVoter extends Voter
  24. {
  25.     const ATTR 'CRUD_VOTER';
  26.     /**
  27.      * @var EntityManagerInterface
  28.      */
  29.     private $entityManager;
  30.     /**
  31.      * @var Request|null
  32.      */
  33.     private $request null;
  34.     /**
  35.      * @var Security
  36.      */
  37.     private $security;
  38.     /**
  39.      * @var CacheItemPoolInterface
  40.      */
  41.     private $cacheItemPool;
  42.     /**
  43.      * @var SessionService
  44.      */
  45.     private $sessionService;
  46.     /**
  47.      * CrudVoter constructor.
  48.      * @param EntityManagerInterface $entityManager
  49.      * @param RequestStack $requestStack
  50.      * @param Security $security
  51.      * @param CacheItemPoolInterface $cacheItemPool
  52.      * @param SessionService $sessionService
  53.      */
  54.     public function __construct(
  55.         EntityManagerInterface $entityManager,
  56.         RequestStack $requestStack,
  57.         Security $security,
  58.         CacheItemPoolInterface $cacheItemPool,
  59.         SessionService $sessionService
  60.     ) {
  61.         $this->entityManager $entityManager;
  62.         $this->request $requestStack->getMasterRequest();
  63.         $this->security $security;
  64.         $this->cacheItemPool $cacheItemPool;
  65.         $this->sessionService $sessionService;
  66.     }
  67.     /**
  68.      * @return EntityManagerInterface
  69.      */
  70.     public function getEntityManager(): EntityManagerInterface
  71.     {
  72.         return $this->entityManager;
  73.     }
  74.     /**
  75.      * @return Request|null
  76.      */
  77.     public function getRequest(): ?Request
  78.     {
  79.         return $this->request;
  80.     }
  81.     /**
  82.      * @return Security
  83.      */
  84.     public function getSecurity(): Security
  85.     {
  86.         return $this->security;
  87.     }
  88.     /**
  89.      * {@inheritdoc}
  90.      */
  91.     protected function supports($attribute$subject)
  92.     {
  93.         return $attribute === self::ATTR && $this->request !== null;
  94.     }
  95.     /**
  96.      * {@inheritdoc}
  97.      */
  98.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  99.     {
  100.         // todo: may be we can handle security exceptions to throw more meaningful exceptions
  101.         $endpoint $this->request->attributes->get('_route');
  102.         $routeRoles = [];
  103.         $cacheItem $this->cacheItemPool->getItem($endpoint);
  104.         if ($cacheItem->isHit()) {
  105.             $routeRoles $cacheItem->get();
  106.         } else {
  107.             /** @var Route $route */
  108.             $route $this->entityManager
  109.                 ->getRepository(Route::class)
  110.                 ->findOneBy(['endpoint' => $endpoint]);
  111.             if ($route !== null) {
  112.                 $routeRoles $route->getRoles()->map(function (Role $role) {
  113.                     return $role->getIdentifier();
  114.                 })->toArray();
  115.             }
  116.         }
  117.         return $this->sessionService->hasOneOfRoles($routeRoles);
  118.     }
  119. }