src/LocalLife/UserBundle/Security/Voter/OwnerVoter.php line 11

Open in your IDE?
  1. <?php
  2. namespace LocalLife\UserBundle\Security\Voter;
  3. use LocalLife\UserBundle\Entity\User;
  4. use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
  5. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  6. use Symfony\Component\Security\Core\User\UserInterface;
  7. use Symfony\Component\DependencyInjection\Container;
  8. class OwnerVoter implements VoterInterface
  9. {
  10.     const ACTION_CREATE 'CREATE';
  11.     const ACTION_READ 'READ';
  12.     const ACTION_UPDATE 'UPDATE';
  13.     const ACTION_DELETE 'DELETE';
  14.     const ABILITY_NAME_OWNER 'OWNER';
  15.     private $roles;
  16.     public function __construct(Container $container)
  17.     {
  18.         $this->roles $container->getParameter('security.role_hierarchy.roles');
  19.     }
  20.     public function supportsAttribute($attribute)
  21.     {
  22.         return in_array($attribute, array(
  23.             self::ACTION_READ,
  24.             self::ACTION_UPDATE,
  25.             self::ACTION_DELETE,
  26.             self::ACTION_CREATE,
  27.         ));
  28.     }
  29.     public function supportsClass($class)
  30.     {
  31.         $reflectionClass = new \ReflectionClass($class);
  32.         return $reflectionClass->implementsInterface('LocalLife\UserBundle\Entity\HasOwnerInterface');
  33.     }
  34.     public function vote(TokenInterface $token$object, array $attributes)
  35.     {
  36.         /** @var User $user */
  37.         $user $token->getUser();
  38.         if (!$user instanceof UserInterface) {
  39.             return VoterInterface::ACCESS_ABSTAIN;
  40.         }
  41.         $role $user->getRoles();
  42.         if (array_key_exists((string) $role[0], $this->roles)) {
  43.             $roles $this->roles[(string) $role[0]];
  44.             $roles[] = (string) $role[0];
  45.         } else {
  46.             $roles[] = (string) $role[0];
  47.         }
  48.         if (!$this->supportsClass(get_class($object))) {
  49.             if (get_class($object) == get_class($this)) {
  50.                 if (in_array($attributes[0], $roles)) {
  51.                     return VoterInterface::ACCESS_GRANTED;
  52.                 }
  53.             }
  54.             return VoterInterface::ACCESS_ABSTAIN;
  55.         }
  56.         if (!== count($attributes)) {
  57.             throw new \InvalidArgumentException(
  58.                 'Only one attribute is allowed for CREATE, READ, UPDATE or DELETE'
  59.             );
  60.         }
  61.         $reflection = new \ReflectionClass($object);
  62.         $shortClassName strtoupper(Container::underscore($reflection->getShortName()));
  63.         $baseRoleName 'ABILITY_'.$shortClassName;
  64.         $attribute $attributes[0];
  65.         $actionRole '';
  66.         if (=== strpos($attribute$baseRoleName)) {
  67.             $actionRole substr($attributestrlen($baseRoleName) + 1);
  68.         }
  69.         if (!$this->supportsAttribute($actionRole)) {
  70.             return VoterInterface::ACCESS_ABSTAIN;
  71.         }
  72.         $roleOwn $baseRoleName.'_'.self::ABILITY_NAME_OWNER;
  73.         if (in_array($roleOwn$roles) && in_array($attribute$roles)) {
  74.             $owners $object->getOwners();
  75.             foreach ($owners as $owner) {
  76.                 if ($owner && $owner->getId() == $user->getId()) {
  77.                     return VoterInterface::ACCESS_GRANTED;
  78.                 }
  79.             }
  80.             return VoterInterface::ACCESS_DENIED;
  81.         } elseif (in_array($attribute$roles)) {
  82.             return VoterInterface::ACCESS_GRANTED;
  83.         }
  84.         return VoterInterface::ACCESS_ABSTAIN;
  85.     }
  86. }