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\Enum\UserEnum;
  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 READ "READ";
  12.     public const EDIT "EDIT";
  13.     public const DELETE "DELETE";
  14.     /**
  15.      * @var Security
  16.      */
  17.     private $security;
  18.     public function __construct(Security $security)
  19.     {
  20.         $this->security $security;
  21.     }
  22.     protected function supports($attribute$subject)
  23.     {
  24.         if (!in_array($attribute, [self::READself::EDITself::DELETE])) {
  25.             return false;
  26.         }
  27.         if (!$subject instanceof User) {
  28.             return false;
  29.         }
  30.         return true;
  31.     }
  32.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  33.     {
  34.         /** @var User $user */
  35.         $user $token->getUser();
  36.         if (!$user instanceof UserInterface) {
  37.             return false;
  38.         }
  39.         if ($this->security->isGranted(UserEnum::SUPER_ADMIN)) {
  40.             return true;
  41.         }
  42.         switch ($attribute) {
  43.             case self::READ:
  44.                 return $this->canRead($user$subject);
  45.                 break;
  46.             case self::EDIT:
  47.                 return $this->canEdit($user$subject);
  48.                 break;
  49.             case self::DELETE:
  50.                 return $this->canDelete($user$subject);
  51.                 break;
  52.         }
  53.         return false;
  54.     }
  55.     private function canRead(User $currentUserUser $subject): bool
  56.     {
  57.         return $this->isOwnerSubject($currentUser$subject);
  58.     }
  59.     private function canDelete(User $currentUserUser $subject): bool
  60.     {
  61.         return false;
  62.     }
  63.     private function canEdit(User $currentUserUser $subject): bool
  64.     {
  65.         return $this->isOwnerSubject($currentUser$subject);
  66.     }
  67.     private function isOwnerSubject(User $currentUserUser $subject): bool
  68.     {
  69.         return $currentUser === $subject;
  70.     }
  71. }