<?php 
 
/* 
 * This file is part of the Symfony package. 
 * 
 * (c) Fabien Potencier <[email protected]> 
 * 
 * For the full copyright and license information, please view the LICENSE 
 * file that was distributed with this source code. 
 */ 
 
namespace Symfony\Component\Security\Core\Authorization\Voter; 
 
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
 
/** 
 * RoleVoter votes if any attribute starts with a given prefix. 
 * 
 * @author Fabien Potencier <[email protected]> 
 */ 
class RoleVoter implements CacheableVoterInterface 
{ 
    private $prefix; 
 
    public function __construct(string $prefix = 'ROLE_') 
    { 
        $this->prefix = $prefix; 
    } 
 
    /** 
     * {@inheritdoc} 
     */ 
    public function vote(TokenInterface $token, $subject, array $attributes) 
    { 
        $result = VoterInterface::ACCESS_ABSTAIN; 
        $roles = $this->extractRoles($token); 
 
        foreach ($attributes as $attribute) { 
            if (!\is_string($attribute) || !str_starts_with($attribute, $this->prefix)) { 
                continue; 
            } 
 
            if ('ROLE_PREVIOUS_ADMIN' === $attribute) { 
                trigger_deprecation('symfony/security-core', '5.1', 'The ROLE_PREVIOUS_ADMIN role is deprecated and will be removed in version 6.0, use the IS_IMPERSONATOR attribute instead.'); 
            } 
 
            $result = VoterInterface::ACCESS_DENIED; 
            foreach ($roles as $role) { 
                if ($attribute === $role) { 
                    return VoterInterface::ACCESS_GRANTED; 
                } 
            } 
        } 
 
        return $result; 
    } 
 
    public function supportsAttribute(string $attribute): bool 
    { 
        return str_starts_with($attribute, $this->prefix); 
    } 
 
    public function supportsType(string $subjectType): bool 
    { 
        return true; 
    } 
 
    protected function extractRoles(TokenInterface $token) 
    { 
        return $token->getRoleNames(); 
    } 
}