src/Security/Voter/User/UserPermissionVoter.php line 22

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Security\Voter\User;
  4. use App\Model\User\Entity\User\Role\RoleConstants;
  5. use App\Model\User\Entity\User\Role\UserPermission;
  6. use App\Security\UserIdentity;
  7. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  8. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  9. /**
  10.  * Поштучные права из UserPermission: админ может всё, остальные — только если право
  11.  * заведено для их роли (UserPermission::forRole), включено в роли (roles.permissions)
  12.  * и выдано им лично (user_permissions, код с префиксом user_). Оба набора прав
  13.  * подгружает UserProvider::refreshUser.
  14.  *
  15.  *     $this->denyAccessUnlessGranted(Permission::PROCEDURE_PROLONG);
  16.  *     {% if is_granted('procedure_prolong') %}
  17.  */
  18. class UserPermissionVoter extends Voter
  19. {
  20.     protected function supports(string $attribute, $subject): bool
  21.     {
  22.         return UserPermission::isIndividual($attribute);
  23.     }
  24.     protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
  25.     {
  26.         $user = $token->getUser();
  27.         if (!$user instanceof UserIdentity) {
  28.             return false;
  29.         }
  30.         if ((new RoleConstants($user->getRole()))->isAdmin()) {
  31.             return true;
  32.         }
  33.         return UserPermission::isAllowedFor($attribute, $user->getRole())
  34.             && $user->isPermission($attribute)
  35.             && $user->isPermission(UserPermission::personal($attribute));
  36.     }
  37. }