vendor/symfony/security-core/Authorization/Voter/Voter.php line 27

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\Security\Core\Authorization\Voter;
  11. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  12. /**
  13.  * Voter is an abstract default implementation of a voter.
  14.  *
  15.  * @author Roman Marintšenko <inoryy@gmail.com>
  16.  * @author Grégoire Pineau <lyrixx@lyrixx.info>
  17.  */
  18. abstract class Voter implements VoterInterfaceCacheableVoterInterface
  19. {
  20.     /**
  21.      * {@inheritdoc}
  22.      */
  23.     public function vote(TokenInterface $token$subject, array $attributes)
  24.     {
  25.         // abstain vote by default in case none of the attributes are supported
  26.         $vote self::ACCESS_ABSTAIN;
  27.         foreach ($attributes as $attribute) {
  28.             try {
  29.                 if (!$this->supports($attribute$subject)) {
  30.                     continue;
  31.                 }
  32.             } catch (\TypeError $e) {
  33.                 if (\PHP_VERSION_ID 80000) {
  34.                     if (=== strpos($e->getMessage(), 'Argument 1 passed to')
  35.                         && false !== strpos($e->getMessage(), '::supports() must be of the type string')) {
  36.                         continue;
  37.                     }
  38.                 } elseif (false !== strpos($e->getMessage(), 'supports(): Argument #1')) {
  39.                     continue;
  40.                 }
  41.                 throw $e;
  42.             }
  43.             // as soon as at least one attribute is supported, default is to deny access
  44.             $vote self::ACCESS_DENIED;
  45.             if ($this->voteOnAttribute($attribute$subject$token)) {
  46.                 // grant access as soon as at least one attribute returns a positive response
  47.                 return self::ACCESS_GRANTED;
  48.             }
  49.         }
  50.         return $vote;
  51.     }
  52.     /**
  53.      * Return false if your voter doesn't support the given attribute. Symfony will cache
  54.      * that decision and won't call your voter again for that attribute.
  55.      */
  56.     public function supportsAttribute(string $attribute): bool
  57.     {
  58.         return true;
  59.     }
  60.     /**
  61.      * Return false if your voter doesn't support the given subject type. Symfony will cache
  62.      * that decision and won't call your voter again for that subject type.
  63.      *
  64.      * @param string $subjectType The type of the subject inferred by `get_class()` or `get_debug_type()`
  65.      */
  66.     public function supportsType(string $subjectType): bool
  67.     {
  68.         return true;
  69.     }
  70.     /**
  71.      * Determines if the attribute and subject are supported by this voter.
  72.      *
  73.      * @param string $attribute An attribute
  74.      * @param mixed  $subject   The subject to secure, e.g. an object the user wants to access or any other PHP type
  75.      *
  76.      * @return bool
  77.      */
  78.     abstract protected function supports(string $attribute$subject);
  79.     /**
  80.      * Perform a single access check operation on a given attribute, subject and token.
  81.      * It is safe to assume that $attribute and $subject already passed the "supports()" method check.
  82.      *
  83.      * @param mixed $subject
  84.      *
  85.      * @return bool
  86.      */
  87.     abstract protected function voteOnAttribute(string $attribute$subjectTokenInterface $token);
  88. }