У меня была такая же проблема. Я решил это путем создания собственного избирателя. По какой-то причине функция is_granted не работает, как сказано в документации. Изучив код, я заметил, что в этом случае он никогда не находит избирателя, поэтому я и создал его.
Ниже приведен пример используемого мной избирателя:
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Core\User\UserInterface;
class MenuVoter extends Voter
{
/**
*
* @var Security
*/
private $security;
public function __construct(Security $security)
{
$this->security = $security;
}
/**
* {@inheritdoc}
*/
protected function supports($attribute, $subject): bool
{
return $subject === null && \is_array($attribute);
}
/**
* {@inheritdoc}
*/
protected function voteOnAttribute($attributes, $post, TokenInterface $token): bool
{
$user = $token->getUser();
$r = false;
if (!($user instanceof UserInterface)) {
return false;
}
foreach ($attributes as $attribute) {
if ($this->security->isGranted($attribute)) {
$r = true;
break;
}
}
return $r;
}
}
Что в основном это делается для того, чтобы l oop пройти через каждую роль (атрибут) и проверить, предоставлен ли доступ для одной из них.
Я надеюсь, что это поможет, и если у кого-то есть способ получше, который я хотел бы узнать.