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, $subject, TokenInterface $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. }