src/Security/Voter/ApplicationVoter.php line 14

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\AuthUser;
  4. use App\Entity\UserAction;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
  9. use Symfony\Component\Security\Core\Security;
  10. use Symfony\Component\Security\Core\User\UserInterface;
  11. class ApplicationVoter extends Voter
  12. {
  13.     /** @var Security */
  14.     private Security $security;
  15.     /** @var EntityManagerInterface */
  16.     private EntityManagerInterface $em;
  17.     public function __construct(Security $securityEntityManagerInterface $em)
  18.     {
  19.         $this->security $security;
  20.         $this->em $em;
  21.     }
  22.     protected function supports(string $attribute$subject): bool
  23.     {
  24.         return in_array(
  25.             $attribute,
  26.             [
  27.                 'ADD',
  28.                 'EDIT',
  29.                 'DELETE',
  30.                 'READ_COLLECTION',
  31.                 'READ_ITEM',
  32.                 'VALIDATE',
  33.                 'OUTER_COMMUNICATION'
  34.             ]);
  35.     }
  36.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  37.     {
  38.         if (!$attribute || !$subject) {
  39.             return false;
  40.         }
  41.         /** @var AuthUser $user */
  42.         $user $token->getUser();
  43.         if (!$user instanceof UserInterface) {
  44.             return false;
  45.         }
  46.         if ($this->security->isGranted("ROLE_SUPER_ADMIN")) {
  47.             return true;
  48.         }
  49.         $actions $this->em->getRepository(UserAction::class)->findOneBy([
  50.             'authUser' => $user,
  51.             'objectName' => $subject
  52.         ]);
  53.         if ($actions) {
  54.             $functionName sprintf('get%s'$this->snakeToCamel($attribute));
  55.             return $actions->{$functionName}();
  56.         }
  57.         return VoterInterface::ACCESS_DENIED;
  58.     }
  59.     private function snakeToCamel($str)
  60.     {
  61.         return str_replace(' '''ucwords(str_replace('_'' 'strtolower($str))));
  62.     }
  63. }