src/Security/AdminAclVoter.php line 15

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Security;
  4. use App\Entity\System\Role;
  5. use App\Manager\System\AdminAclManager;
  6. use App\Service\SecurityService;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  10. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  11. class AdminAclVoter extends Voter
  12. {
  13.     public const ALLOW_ADMIN_ACCESS 'ALLOW_ADMIN_ACCESS';
  14.     private AdminAclManager $ACLManager;
  15.     private RequestStack $requestStack;
  16.     private SecurityService $securityService;
  17.     public function __construct(
  18.         AdminAclManager $ACLManager,
  19.         RequestStack $requestStack,
  20.         SecurityService $securityService
  21.     ) {
  22.         $this->ACLManager $ACLManager;
  23.         $this->requestStack $requestStack;
  24.         $this->securityService $securityService;
  25.     }
  26.     protected function supports($attribute$subject): bool
  27.     {
  28.         return $attribute === self::ALLOW_ADMIN_ACCESS;
  29.     }
  30.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  31.     {
  32.         $employee $this->securityService->findSessionEmployee();
  33.         if (!$employee) {
  34.             return false;
  35.         }
  36.         if ($this->securityService->isGranted(Role::ROLE_EMPLOYEE_DEVELOPER)) {
  37.             return true;
  38.         }
  39.         if (is_string($subject)) {
  40.             $route $subject;
  41.         } elseif ($subject instanceof Request) {
  42.             $route $this->requestStack->getMainRequest()->get('_route');
  43.         } else {
  44.             return false;
  45.         }
  46.         $adminACL $this->ACLManager->findOneBy(['route' => $route]);
  47.         if (!$adminACL) {
  48.             return false;
  49.         }
  50.         foreach ($adminACL->getRoles() as $role) {
  51.             if ($this->securityService->isGranted($role->getName(), $employee)) {
  52.                 return true;
  53.             }
  54.         }
  55.         if ($adminACL->getEmployees()->contains($employee)) {
  56.             return true;
  57.         }
  58.         return false;
  59.     }
  60. }