src/Security/Voter/UserVoter.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\User;
  4. use App\Repository\UserRepository;
  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. use Symfony\Component\Security\Core\User\UserInterface;
  9. class UserVoter extends Voter
  10. {
  11.     public const EDIT 'USER_EDIT';
  12.     public const VIEW 'USER_VIEW';
  13.     public const ADD 'USER_ADD';
  14.     public const DELETE 'USER_DELETE';
  15.     public const CAN_BLOCK 'USER_CAN_BLOCK';
  16.     public const CAN_RESET_PASSWORD 'USER_CAN_RESET_PSWD';
  17.     public const CHANGE_COMPANY 'USER_CHANGE_COMPANY';
  18.     public const ASSIGN_COMPANY_ADMIN 'USER_ASSIGN_COMPANY_ADMIN';
  19.     public const ASSIGN_ADMIN 'USER_ASSIGN_ADMIN';
  20.     /**
  21.      * @var Security
  22.      */
  23.     protected $_security;
  24.     /**
  25.      * @var UserRepository
  26.      */
  27.     protected $_userRepository;
  28.     /**
  29.      * @param Security $_security
  30.      */
  31.     public function __construct(Security $_securityUserRepository $userRepository)
  32.     {
  33.         $this->_security $_security;
  34.         $this->_userRepository $userRepository;
  35.     }
  36.     protected function supports(string $attribute$subject): bool
  37.     {
  38.         return in_array($attribute, [
  39.             self::EDIT,
  40.             self::VIEW,
  41.             self::ADD,
  42.             self::CAN_BLOCK,
  43.             self::CHANGE_COMPANY,
  44.             self::ASSIGN_COMPANY_ADMIN,
  45.             self::ASSIGN_ADMIN,
  46.             self::CAN_RESET_PASSWORD,
  47.             self::DELETE
  48.         ]);
  49.     }
  50.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  51.     {
  52.         if ($this->_security->isGranted(User::ROLE_ADMIN)) {
  53.             return true;
  54.         }
  55.         $user $token->getUser();
  56.         // if the user is anonymous, do not grant access
  57.         if (!$user instanceof UserInterface) {
  58.             return false;
  59.         }
  60.         $userForEdit $subject;
  61.         // ... (check conditions and return true to grant permission) ...
  62.         switch ($attribute) {
  63.             case self::EDIT:
  64.                 return $this->canEdit($user$userForEdit);
  65.             case self::VIEW:
  66.                 return $this->canView($user$userForEdit);
  67.             case self::ADD:
  68.                 return $this->canAdd($user);
  69.             case self::CAN_BLOCK:
  70.                 return $this->canBlock($user$userForEdit);
  71.             case self::CAN_RESET_PASSWORD:
  72.                 return $this->canResetPassword($user$userForEdit);
  73.             case self::CHANGE_COMPANY:
  74.                 return $this->canChangeCompany($user$userForEdit);
  75.             case self::ASSIGN_COMPANY_ADMIN:
  76.                 return $this->canAssignCompanyAdmin($user$userForEdit);
  77.             case self::ASSIGN_ADMIN:
  78.                 return $this->canAssignAdmin($user$userForEdit);
  79.             case self::DELETE:
  80.                 return $this->canDelete($user$userForEdit);
  81.         }
  82.         return false;
  83.     }
  84.     /**
  85.      * @param User $user
  86.      * @param User $userForEdit
  87.      * @return bool
  88.      */
  89.     protected function canDelete(UserInterface $userUser $userForEdit)
  90.     {
  91.         if ($user->hasRole(User::ROLE_COMPANY_ADMIN)) {
  92.             return true;
  93.         }
  94.         return false;
  95.     }
  96.     /**
  97.      * @param User $user
  98.      * @param User $userForEdit
  99.      * @return bool
  100.      */
  101.     protected function canBlock(UserInterface $userUser $userToBlock)
  102.     {
  103.         if ($user->hasRole(User::ROLE_COMPANY_ADMIN)) {
  104.             return true;
  105.         }
  106.         if($user->hasRole(User::ROLE_MERCHANT)){
  107.             $idsJuniors = [];
  108.             $this->_userRepository->getJuniorIdsRecursivly($user$idsJuniors);
  109.             return in_array($user->getId(), $idsJuniors) || $user->getId() === $userToBlock->getId();
  110.         }
  111.         return false;
  112.     }
  113.     /**
  114.      * @param User $user
  115.      * @param User $userForEdit
  116.      * @return bool
  117.      */
  118.     protected function canResetPassword(UserInterface $userUser $userToBlock)
  119.     {
  120.         if ($user->hasRole(User::ROLE_COMPANY_ADMIN)) {
  121.             return true;
  122.         }
  123.         if($user->hasRole(User::ROLE_MERCHANT)){
  124.             $idsJuniors = [];
  125.             $this->_userRepository->getJuniorIdsRecursivly($user$idsJuniors);
  126.             return in_array($user->getId(), $idsJuniors) || $user->getId() === $userToBlock->getId();
  127.         }
  128.         return false;
  129.     }
  130.     /**
  131.      * @param User $user
  132.      * @param User $userForEdit
  133.      * @return bool
  134.      */
  135.     protected function canEdit(UserInterface $userUser $userForEdit)
  136.     {
  137.         if ($user->hasRole(User::ROLE_COMPANY_ADMIN)) {
  138.             return true;
  139.         }
  140.         if ($user->hasRole(User::ROLE_COMPANY_USER)) {
  141.             return true;
  142.         }
  143.         if($user->hasRole(User::ROLE_MERCHANT)){
  144.             $idsJuniors = [];
  145.             $this->_userRepository->getJuniorIdsRecursivly($user$idsJuniors);
  146.             return in_array($user->getId(), $idsJuniors) || $user->getId() === $userForEdit->getId();
  147.         }
  148.         if ($user->hasRole(User::ROLE_CUSTOMER)
  149.         ) {
  150.             return $user->getId() === $userForEdit->getId();
  151.         }
  152.         return false;
  153.     }
  154.     /**
  155.      * @param User $user
  156.      * @param User $userForEdit
  157.      * @return bool
  158.      */
  159.     protected function canView(UserInterface $userUser $userForEdit)
  160.     {
  161.         if ($user->hasRole(User::ROLE_COMPANY_ADMIN)) {
  162.             return true;
  163.         }
  164.         if($user->hasRole(User::ROLE_MERCHANT)){
  165.             $idsJuniors = [];
  166.             $this->_userRepository->getJuniorIdsRecursivly($user$idsJuniors);
  167.             return in_array($user->getId(), $idsJuniors) || $user->getId() === $userForEdit->getId();
  168.         }
  169.         if (
  170.             $user->hasRole(User::ROLE_COMPANY_USER) ||
  171.             $user->hasRole(User::ROLE_CUSTOMER)
  172.         ) {
  173.             return $user->getId() === $userForEdit->getId();
  174.         }
  175.         return false;
  176.     }
  177.     /**
  178.      * @param User $user
  179.      * @param User $userForEdit
  180.      * @return bool
  181.      */
  182.     protected function canAdd(UserInterface $user)
  183.     {
  184.         if ($user->hasRole(User::ROLE_COMPANY_ADMIN)) {
  185.             return true;
  186.         }
  187.         return false;
  188.     }
  189.     /**
  190.      * @param User $user
  191.      * @param User|null $userForEdit
  192.      * @return bool
  193.      */
  194.     protected function canChangeCompany(UserInterface $user$userForEdit)
  195.     {
  196.         return false;
  197.     }
  198.     /**
  199.      * @param User $user
  200.      * @param User|null $userForEdit
  201.      * @return bool
  202.      */
  203.     protected function canAssignCompanyAdmin(UserInterface $user$userForEdit)
  204.     {
  205.         if($user->hasRole(User::ROLE_COMPANY_ADMIN)){
  206.             return true;
  207.         }
  208.         return false;
  209.     }
  210.     /**
  211.      * @param User $user
  212.      * @param User|null $userForEdit
  213.      * @return bool
  214.      */
  215.     protected function canAssignAdmin(UserInterface $user$userForEdit)
  216.     {
  217.         return false;
  218.     }
  219. }