src/Security/Voter/Certificate/CertificateVoter.php line 13

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Security\Voter\Certificate;
  4. use App\Model\User\Entity\User\Role\Permission;
  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 CertificateVoter extends Voter
  10. {
  11.     public const CERTIFICATE_SHOW = 'certificate_show';
  12.     public const CERTIFICATE_LIST = 'certificate_list';
  13.     public const CERTIFICATE_ADD = 'certificate_add';
  14.     public const CERTIFICATE_DELETE = 'certificate_delete';
  15.     // Архивирование конкретного сертификата: модератор или владелец. Субъект — user_id владельца.
  16.     public const CERTIFICATE_ARCHIVE = 'certificate_archive';
  17.     private $security;
  18.     /**
  19.      * @param Security $security
  20.      */
  21.     public function __construct(Security $security)
  22.     {
  23.         $this->security = $security;
  24.     }
  25.     /**
  26.      * @param string $attribute
  27.      * @param mixed $subject
  28.      * @return bool
  29.      */
  30.     protected function supports(string $attribute, $subject): bool
  31.     {
  32.         return in_array($attribute, [self::CERTIFICATE_SHOW, self::CERTIFICATE_ADD, self::CERTIFICATE_LIST, self::CERTIFICATE_DELETE, self::CERTIFICATE_ARCHIVE], true);
  33.     }
  34.     /**
  35.      * @param string $attribute
  36.      * @param mixed $user_id
  37.      * @param TokenInterface $token
  38.      * @return bool
  39.      */
  40.     protected function voteOnAttribute(string $attribute, $user_id, TokenInterface $token): bool
  41.     {
  42.         if ($this->security->isGranted('ROLE_MODERATOR')) {
  43.             return true;
  44.         }
  45.         // Расширенный менеджер — только просмотр чужих сертификатов
  46.         if ($this->security->isGranted('ROLE_MANAGER_EXTENDED')) {
  47.             return in_array($attribute, [self::CERTIFICATE_LIST, self::CERTIFICATE_SHOW], true);
  48.         }
  49.         $user = $token->getUser();
  50.         if (!$user instanceof UserInterface) {
  51.             return false;
  52.         }
  53.         if ($user->getId() !== $user_id) {
  54.             return false;
  55.         }
  56.         switch ($attribute) {
  57.             case self::CERTIFICATE_LIST:
  58.                 if ($user->getId() === $user_id) {
  59.                     return true;
  60.                 }
  61.                 return $user->isPermission(Permission::CERTIFICATE_LIST);
  62.                 break;
  63.             case self::CERTIFICATE_DELETE:
  64.                 return $user->isPermission(Permission::CERTIFICATE_DELETE);
  65.                 break;
  66.             case self::CERTIFICATE_ARCHIVE:
  67.                 return true;
  68.             case self::CERTIFICATE_SHOW:
  69.                 if ($user->getId() === $user_id) {
  70.                     return true;
  71.                 }
  72.                 break;
  73.             case self::CERTIFICATE_ADD:
  74.                 return $user->isPermission(Permission::CERTIFICATE_ADD);
  75.                 break;
  76.             default:
  77.             }
  78.         return false;
  79.     }
  80. }