src/Access/Security/Voter/AccessVoter.php line 13

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Access\Security\Voter;
  4. use App\Security\Doctrine\Entity\User;
  5. use App\Security\Security\Store\Roles;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;
  8. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  9. final class AccessVoter extends Voter
  10. {
  11.     public const DELETE 'delete';
  12.     public const SUSPEND 'suspend';
  13.     public const ACTIVATE 'activate';
  14.     public function __construct(private AccessDecisionManagerInterface $accessDecisionManager)
  15.     {
  16.     }
  17.     protected function supports(string $attributemixed $subject): bool
  18.     {
  19.         if (!$subject instanceof User) {
  20.             return false;
  21.         }
  22.         return in_array($attribute, [self::DELETEself::SUSPENDself::ACTIVATE], true);
  23.     }
  24.     protected function voteOnAttribute(string $attributemixed $subjectTokenInterface $token): bool
  25.     {
  26.         if (!$subject instanceof User) {
  27.             return false;
  28.         }
  29.         return match ($attribute) {
  30.             self::DELETE => $token->getUser() !== $subject
  31.                     && $this->accessDecisionManager->decide($token, [Roles::ACCESS_DELETE], $subject),
  32.             self::SUSPEND => $token->getUser() !== $subject
  33.                     && !$subject->isSuspended()
  34.                     && $this->accessDecisionManager->decide($token, [Roles::ACCESS_SUSPEND], $subject),
  35.             self::ACTIVATE => $token->getUser() !== $subject
  36.                     && $subject->isSuspended()
  37.                     && $this->accessDecisionManager->decide($token, [Roles::ACCESS_ACTIVATE], $subject),
  38.             default => false // @codeCoverageIgnore
  39.         };
  40.     }
  41. }