src/Security/AdminAclVoter.php line 16

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