src/Service/SuperAdmin/Panel/AccessVoters/UserVoter.php line 9

Open in your IDE?
  1. <?php
  2. namespace Harmonizely\Service\SuperAdmin\Panel\AccessVoters;
  3. use Harmonizely\Types\SuperAdmin\UserRole;
  4. use Harmonizely\Entity\SuperAdmin\UserEntity;
  5. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  6. class UserVoter extends AbstractVoter
  7. {
  8.     /**
  9.      * Resource name
  10.      */
  11.     const RESOURCE_NAME 'user';
  12.     /**
  13.      * Edit user
  14.      */
  15.     const EDIT 'user_edit';
  16.     /**
  17.      * Block user
  18.      */
  19.     const BLOCK 'user_block';
  20.     /**
  21.      * View users, user
  22.      */
  23.     const VIEW 'user_view';
  24.     /**
  25.      * Edit self profile
  26.      */
  27.     const EDIT_PROFILE 'user_edit_profile';
  28.     /**
  29.      * View self profile
  30.      */
  31.     const VIEW_PROFILE 'user_view_profile';
  32.     /**
  33.      * Change password
  34.      */
  35.     const CHANGE_PASSWORD 'user_change_password';
  36.     /**
  37.      * Return resource name
  38.      *
  39.      * @return string
  40.      */
  41.     function getResourceName(): string
  42.     {
  43.         return self::RESOURCE_NAME;
  44.     }
  45.     /**
  46.      * Return allowed attributes for current user
  47.      *
  48.      * @return array|string[]
  49.      */
  50.     function getResourceAttributes(): array
  51.     {
  52.         return [
  53.             self::EDIT,
  54.             self::BLOCK,
  55.             self::VIEW,
  56.             self::EDIT_PROFILE,
  57.             self::VIEW_PROFILE,
  58.             self::CHANGE_PASSWORD
  59.         ];
  60.     }
  61.     /**
  62.      * Return allowed attributes for current user
  63.      *
  64.      * @param UserEntity $user
  65.      * @return array|string[]
  66.      */
  67.     function getAllowedAttributes(UserEntity $user): array
  68.     {
  69.         switch ($user->getRole()) {
  70.             case UserRole::ROLE_ADMIN:
  71.                 return $this->getResourceAttributes();
  72.             case UserRole::ROLE_SYSTEM_USER:
  73.                 return [self::EDITself::BLOCKself::VIEWself::VIEW_PROFILEself::EDIT_PROFILEself::CHANGE_PASSWORD];
  74.             default:
  75.                 return [self::VIEW_PROFILEself::EDIT_PROFILEself::CHANGE_PASSWORD];
  76.         }
  77.     }
  78.     /**
  79.      * Determines if the attribute and subject are supported by this voter.
  80.      *
  81.      * @param string $attribute An attribute
  82.      * @param mixed $subject The subject to secure, e.g. an object the user wants to access or any other PHP type
  83.      *
  84.      * @return bool True if the attribute and subject are supported, false otherwise
  85.      */
  86.     protected function supports($attribute$subject): bool
  87.     {
  88.         if ($subject !== null && !($subject instanceof UserEntity)) {
  89.             return false;
  90.         }
  91.         if ($subject instanceof UserEntity && $subject->getRole() === UserRole::ROLE_SYSTEM_USER && in_array($attribute, [self::EDITself::BLOCKself::CHANGE_PASSWORD])) {
  92.             return false;
  93.         }
  94.         if (!in_array($attribute$this->getResourceAttributes())) {
  95.             return false;
  96.         }
  97.         if (!in_array($attribute, [self::VIEWself::EDIT]) && $subject === null) {
  98.             return false;
  99.         }
  100.         return true;
  101.     }
  102.     /**
  103.      * Perform a single access check operation on a given attribute, subject and token.
  104.      * It is safe to assume that $attribute and $subject already passed the "supports()" method check.
  105.      *
  106.      * @param string $attribute
  107.      * @param mixed $subject
  108.      * @param TokenInterface $token
  109.      * @return bool
  110.      */
  111.     protected function voteOnAttribute($attribute$subjectTokenInterface $token): bool
  112.     {
  113.         $user $token->getUser();
  114.         if (!($user instanceof UserEntity)) {
  115.             return false;
  116.         }
  117.         if (in_array($attribute, [self::EDIT_PROFILEself::VIEW_PROFILE])
  118.             && $user->getId() !== $subject->getId()) {
  119.             return false;
  120.         }
  121.         return parent::voteOnAttribute($attribute$subject$token);
  122.     }
  123. }