src/Security/EntityVoters/DefaultVoter.php line 10

Open in your IDE?
  1. <?php
  2. namespace App\Security\EntityVoters;
  3. use ApiPlatform\Core\Validator\ValidatorInterface;
  4. use App\Entity\User;
  5. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  6. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  7. use Symfony\Component\Security\Core\Security;
  8. class DefaultVoter extends Voter
  9. {
  10.     const ENTITY_PATH '\\App\\Entity\\';
  11.     protected string $entityClassName;
  12.     protected Security $security;
  13.     protected ValidatorInterface $validator;
  14.     protected ?User $user;
  15.     public function __construct(
  16.         Security $security,
  17.         ValidatorInterface $validator
  18.     )
  19.     {
  20.         $this->security $security;
  21.         $this->validator $validator;
  22.         $this->user $this->security->getUser();
  23.     }
  24.     protected function supports($attribute$subject): bool
  25.     {
  26.         return in_array($attribute, [
  27.             'DEFAULT_GET',
  28.             'DEFAULT_PATCH',
  29.             'DEFAULT_PUT',
  30.             'DEFAULT_GET_COLLECTION',
  31.             'DEFAULT_POST',
  32.             'DEFAULT_POST_DENORMALIZE',
  33.             'DEFAULT_DELETE'
  34.         ]);
  35.     }
  36.     protected function voteOnAttribute($attribute$subjectTokenInterface $token): bool
  37.     {
  38.         $user $this->security->getUser();
  39.         if ($user && $user->getRole()->getName() === 'ROLE_SUPER_ADMIN')
  40.             return true;
  41.         switch ($attribute)
  42.         {
  43.             case 'DEFAULT_GET_COLLECTION':
  44.                 return true;
  45.             case 'DEFAULT_GET':
  46.                 if (!$user)
  47.                     return true;
  48.                 return $this->checkUserPermissions($user$subject);
  49.             case 'DEFAULT_PUT':
  50.                 if (!$user)
  51.                     return false;
  52.                 return $this->checkUserPermissions($user$subject);
  53.             case 'DEFAULT_PATCH':
  54.                 if (!$user)
  55.                     return false;
  56.                 return $this->checkUserPermissions($user$subject);
  57.             case 'DEFAULT_DELETE':
  58.                 if (!$user)
  59.                     return false;
  60.                 return $this->checkUserPermissionsForDelete($user$subject);
  61.             case 'DEFAULT_POST':
  62.                 if ($user)
  63.                     return true;
  64.         }
  65.         return false;
  66.     }
  67.     private function checkUserPermissions(User $user$subject): bool {
  68.         if (method_exists($subject'getUsers')) {
  69.             foreach ($subject->getUsers() as $subjectUser)
  70.                 if ($subjectUser->getId() === $user->getId())
  71.                     return true;
  72.             return false;
  73.         } else if (method_exists($subject'getComplex')) {
  74.             $complex $subject->getComplex();
  75.             foreach ($complex->getUsers() as $subjectUser)
  76.                 if ($subjectUser->getId() === $user->getId())
  77.                     return true;
  78.             return false;
  79.         } else {
  80.             return true;
  81.         }
  82.     }
  83.     private function checkUserPermissionsForDelete(User $user$subject): bool {
  84.         if (method_exists($subject'getUsers')) {
  85.             foreach ($subject->getUsers() as $subjectUser)
  86.                 if ($subjectUser->getId() === $user->getId())
  87.                     return true;
  88.             return false;
  89.         } else if (method_exists($subject'getComplex')) {
  90.             $complex $subject->getComplex();
  91.             foreach ($complex->getUsers() as $subjectUser)
  92.                 if ($subjectUser->getId() === $user->getId())
  93.                     return true;
  94.             return false;
  95.         } else {
  96.             return false;
  97.         }
  98.     }
  99. }