vendor/crea/security-bundle/src/Voter/UserVoter.php line 12

Open in your IDE?
  1. <?php
  2. namespace Crea\SecurityBundle\Voter;
  3. use Crea\SecurityBundle\Entity\User;
  4. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  5. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  6. use Symfony\Component\Security\Core\User\UserInterface;
  7. class UserVoter extends Voter
  8. {
  9.     const USER_LIST "SECURITY_USER_LIST";
  10.     const USER_CREATE "SECURITY_USER_CREATE";
  11.     const USER_UPDATE_PASSWORD "SECURITY_USER_UPDATE_PASSWORD";
  12.     const USER_UPDATE "SECURITY_USER_UPDATE";
  13.     const USER_REMOVE "SECURITY_USER_REMOVE";
  14.     const USER_IMPERSONATE "SECURITY_USER_IMPERSONATE";
  15.     const USER_CONNECT "SECURITY_USER_CONNECT";
  16.     const USER_DETAIL "SECURITY_USER_DETAIL";
  17.     const USER_ACTIVE "SECURITY_USER_ACTIVE";
  18.     /**
  19.      * @inheritDoc
  20.      */
  21.     protected function supports($attribute$subject): bool
  22.     {
  23.         return in_array($attribute, [
  24.             self::USER_LIST,
  25.             self::USER_CREATE,
  26.             self::USER_UPDATE_PASSWORD,
  27.             self::USER_UPDATE,
  28.             self::USER_REMOVE,
  29.             self::USER_IMPERSONATE,
  30.             self::USER_CONNECT,
  31.             self::USER_DETAIL,
  32.             self::USER_ACTIVE,
  33.         ]) && ($subject === null || $subject instanceof User);
  34.     }
  35.     /**
  36.      * @inheritDoc
  37.      */
  38.     protected function voteOnAttribute($attribute$subjectTokenInterface $token): bool
  39.     {
  40.         /** @var User $loggedUser */
  41.         $loggedUser $token->getUser();
  42.         if (!$loggedUser instanceof UserInterface)
  43.             return false;
  44.         switch ($attribute) {
  45.             case self::USER_DETAIL:
  46.                 return $this->voteOnDetail($subject$loggedUser);
  47.             case self::USER_LIST:
  48.                 return $this->voteOnList($loggedUser);
  49.             case self::USER_ACTIVE:
  50.                 return $this->voteOnActive($loggedUser);
  51.             case self::USER_CREATE:
  52.                 return $this->voteOnCreate($loggedUser);
  53.             case self::USER_UPDATE_PASSWORD:
  54.                 return $this->voteOnpassword($loggedUser);
  55.             case self::USER_UPDATE:
  56.                 return $this->voteOnUpdate($subject$loggedUser);
  57.             case self::USER_REMOVE:
  58.                 return $this->voteOnRemove($subject$loggedUser);
  59.             case self::USER_IMPERSONATE:
  60.                 return $this->voteOnImpersonate($subject$loggedUser);
  61.             case self::USER_CONNECT:
  62.                 return $this->voteOnConnect($subject);
  63.         }
  64.         return false;
  65.     }
  66.     private function voteOnImpersonate($subjectUserInterface $loggedUser): bool
  67.     {
  68.         if ($subject === null) {
  69.             if (in_array(self::USER_IMPERSONATE$loggedUser->getRoles())) {
  70.                 return true;
  71.             }
  72.         } else {
  73.             /** @var User $user */
  74.             $user $subject;
  75.             if (
  76.                 in_array(self::USER_IMPERSONATE$loggedUser->getRoles()) &&
  77.                 $user->getLogin() !== $loggedUser->getUsername() &&
  78.                 $this->voteOnConnect($user)
  79.             ) {
  80.                 return true;
  81.             }
  82.         }
  83.         return false;
  84.     }
  85.     public function voteOnConnect(?UserInterface $subject): bool
  86.     {
  87.         return $subject !== null && $subject->getProfile() !== null && $subject->isEnabled();
  88.     }
  89.     private function voteOnList(UserInterface $loggedUser): bool
  90.     {
  91.         if (in_array(self::USER_LIST$loggedUser->getRoles())) {
  92.             return true;
  93.         }
  94.         return false;
  95.     }
  96.     private function voteOnCreate(UserInterface $loggedUser): bool
  97.     {
  98.         if (in_array(self::USER_CREATE$loggedUser->getRoles())) {
  99.             return true;
  100.         }
  101.         return false;
  102.     }
  103.     private function voteOnPassword(UserInterface $loggedUser): bool
  104.     {
  105.         if (in_array(self::USER_UPDATE_PASSWORD$loggedUser->getRoles())) {
  106.             return true;
  107.         }
  108.         return false;
  109.     }
  110.     private function voteOnUpdate(?UserInterface $subjectUserInterface $loggedUser): bool
  111.     {
  112.         if (!in_array(self::USER_UPDATE$loggedUser->getRoles()))
  113.             return false;
  114.         if (null === $subject)
  115.             return true;
  116.         if ($loggedUser !== $subject)
  117.             return true;
  118.         if (in_array("ROLE_ADMIN"$loggedUser->getRoles()))
  119.             return true;
  120.         return false;
  121.     }
  122.     private function voteOnRemove(?UserInterface $subjectUserInterface $loggedUser): bool
  123.     {
  124.         if (!in_array(self::USER_REMOVE$loggedUser->getRoles()))
  125.             return false;
  126.         if (null === $subject)
  127.             return true;
  128.         if ($loggedUser !== $subject)
  129.             return true;
  130.         return false;
  131.     }
  132.     /**
  133.      * By default, a user can see its own detail, the right let him see the other details
  134.      * @param UserInterface $subject
  135.      * @param UserInterface $loggedUser
  136.      * @return bool
  137.      */
  138.     private function voteOnDetail(UserInterface $subjectUserInterface $loggedUser): bool
  139.     {
  140.         if ($subject->getUsername() === $loggedUser->getUsername())
  141.             return true;
  142.         if (in_array(self::USER_DETAIL$loggedUser->getRoles()))
  143.             return true;
  144.         return false;
  145.     }
  146.     private function voteOnActive(UserInterface $loggedUser): bool
  147.     {
  148.         if (in_array(self::USER_ACTIVE$loggedUser->getRoles())) {
  149.             return true;
  150.         }
  151.         return false;
  152.     }
  153. }