vendor/crea/security-bundle/src/Voter/ProfileVoter.php line 13

Open in your IDE?
  1. <?php
  2. namespace Crea\SecurityBundle\Voter;
  3. use Crea\SecurityBundle\Entity\Profile;
  4. use Crea\SecurityBundle\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\User\UserInterface;
  8. class ProfileVoter extends Voter
  9. {
  10.     const PROFILE_LIST "SECURITY_PROFILE_LIST";
  11.     const PROFILE_CREATE "SECURITY_PROFILE_CREATE";
  12.     const PROFILE_UPDATE "SECURITY_PROFILE_UPDATE";
  13.     const PROFILE_DUPLICATE "SECURITY_PROFILE_DUPLICATE";
  14.     const PROFILE_REMOVE "SECURITY_PROFILE_REMOVE";
  15.     /**
  16.      * @inheritDoc
  17.      */
  18.     protected function supports($attribute$subject): bool
  19.     {
  20.         return in_array($attribute, [
  21.                 self::PROFILE_LIST,
  22.                 self::PROFILE_CREATE,
  23.                 self::PROFILE_UPDATE,
  24.                 self::PROFILE_DUPLICATE,
  25.                 self::PROFILE_REMOVE,
  26.             ]) && ($subject === null || $subject instanceof Profile);
  27.     }
  28.     /**
  29.      * @inheritDoc
  30.      */
  31.     protected function voteOnAttribute($attribute$subjectTokenInterface $token): bool
  32.     {
  33.         /** @var User $loggedUser */
  34.         $loggedUser $token->getUser();
  35.         if (!$loggedUser instanceof UserInterface)
  36.             return false;
  37.         switch ($attribute) {
  38.             case self::PROFILE_LIST:
  39.                 return $this->voteOnList($loggedUser);
  40.             case self::PROFILE_CREATE:
  41.                 return $this->voteOnCreate($loggedUser);
  42.             case self::PROFILE_UPDATE:
  43.                 return $this->voteOnUpdate($subject$loggedUser);
  44.             case self::PROFILE_DUPLICATE:
  45.                 return $this->voteOnDuplicate($subject$loggedUser);
  46.             case self::PROFILE_REMOVE:
  47.                 return $this->voteOnRemove($subject$loggedUser);
  48.         }
  49.         return false;
  50.     }
  51.     private function voteOnList(UserInterface $loggedUser): bool
  52.     {
  53.         if (in_array(self::PROFILE_LIST$loggedUser->getRoles())) {
  54.             return true;
  55.         }
  56.         return false;
  57.     }
  58.     private function voteOnCreate(UserInterface $loggedUser): bool
  59.     {
  60.         if (in_array(self::PROFILE_CREATE$loggedUser->getRoles())) {
  61.             return true;
  62.         }
  63.         return false;
  64.     }
  65.     private function voteOnUpdate(?Profile $subjectUser $loggedUser): bool
  66.     {
  67.         if (!in_array(self::PROFILE_UPDATE$loggedUser->getRoles()))
  68.             return false;
  69.         if (null === $subject)
  70.             return true;
  71.         if ($loggedUser->getProfile()->getId() !== $subject->getId())
  72.             return true;
  73.         if (in_array("ROLE_ADMIN"$loggedUser->getRoles()))
  74.             return true;
  75.         return false;
  76.     }
  77.     private function voteOnRemove(?Profile $subjectUser $loggedUser): bool
  78.     {
  79.         if (!in_array(self::PROFILE_REMOVE$loggedUser->getRoles()))
  80.             return false;
  81.         if (null === $subject)
  82.             return true;
  83.         if ($loggedUser->getProfile()->getId() !== $subject->getId())
  84.             return true;
  85.         if (in_array("ROLE_ADMIN"$loggedUser->getRoles()))
  86.             return true;
  87.         return false;
  88.     }
  89.     private function voteOnDuplicate($subjectUser $loggedUser): bool
  90.     {
  91.         return $this->voteOnUpdate($subject$loggedUser);
  92.     }
  93. }