Twig is_granted () с массивом ролей - PullRequest
0 голосов
/ 03 апреля 2020

Я пытался передать массив в фильтр веток is_granted (), но он не работает, хотя в документации сказано да: https://symfony.com/doc/current/reference/twig_reference.html#is -грамм

Представьте себе app.user имеет роль ROLE_MANAGER.

Пример:

{{ dump(is_granted('ROLE_MANAGER')) }}

Возвращает: true

{{ dump(is_granted(['ROLE_ADMIN','ROLE_MANAGER'])) }}

Возвращает: false

Документация гласит:

роль: тип: строка, строка []

Возвращает true, если текущий пользователь имеет заданный роль. Если в массиве передается несколько ролей, возвращается true, если у пользователя есть хотя бы одна из них.

Но это не работает ... Есть идеи почему?

1 Ответ

1 голос
/ 19 апреля 2020

У меня была такая же проблема. Я решил это путем создания собственного избирателя. По какой-то причине функция 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 пройти через каждую роль (атрибут) и проверить, предоставлен ли доступ для одной из них.

Я надеюсь, что это поможет, и если у кого-то есть способ получше, который я хотел бы узнать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...