Не могу проверить, предоставлена ​​ли роль

Я должен установить динамическую роль для пользователя, когда он входит в систему, поэтому я создал сервис LoginSuccessHanlder с этой функцией при успешном входе в систему:

public function onAuthenticationSuccess(Request $request, TokenInterface $token) {
    $response = null;

    $user = $this->token->getToken()->getUser();
    $poste = $request->get('_poste');
    $user->addRole('ROLE_'.strtoupper($poste));
    $this->em->persist($user);
    $this->em->flush();
    if ($this->authorizationChecker->isGranted('ROLE_USER')) {
        $response = new RedirectResponse($this->router->generate('homepage'));
        $response->headers->setCookie(new Cookie('poste', $poste));
    }

    return $response;
}

Итак, я добавляю новую роль пользователю благодаря полю в форме входа _poste, После того, как я вошел в систему, я должен быть в состоянии сделать:

{% if is_granted("ROLE_FLEX") %}
    message
{% endif %}

Но нет сообщения

Но если я сделаю это:

{{ dump(app.user.roles) }}

У меня в массиве роль ROLE_FLEXпочему я не могу проверить роль с is_granted функция? Что я пропустил?

Для информации я использую FOSUserBundle

РЕДАКТИРОВАТЬ

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

2 ответа

Решение

RoleVoter класс, который используется уровнем безопасности Symfony при передаче роли is_granted() Функция читает роли из токена, а не из объекта пользователя. Это означает, что вам также придется обновить токен соответствующим образом.

Решение, которое я нашел, состояло в том, чтобы создать мою собственную функцию, чтобы проверить, есть ли у пользователя определенная роль:

public function isGranted($role)
{
    return in_array($role, $this->getRoles());
}

теперь я могу использовать {% if app.user.isGranted("ROLE_FLEX") %}

Другие вопросы по тегам