Ошибка Symfony2 isGranted ('MY_ROLE') возвращает true, но брандмауэр возвращает 403

1

Я динамически добавляю роль своему пользователю сразу после входа в систему с помощью прослушивателя AuthenticationSuccessHandlerInterface.

public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
    $user = $this->security->getToken()->getUser();
    $user->addRole('MY_ROLE');

    var_dump($this->security->isGranted('MY_ROLE'));
    var_dump($this->security->getToken()->getRoles()); die;

    return new RedirectResponse('...');
}

Оба var_dump() показывают, что $user получил новое право. Я создал класс User class EquatableInterface и создал в isEqualTo функцию isEqualTo чтобы перезагрузить мои пользовательские данные, а я изменил его без необходимости выхода из системы.

public function isEqualTo(UserInterface $user)
{
    return false;
}

Но когда мое перенаправление прослушивателя достигнуто, я получил Access Denied на белой странице без профайлера на странице.

access_control:
    - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/login/check$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, roles: MY_ROLE }

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

Любая идея о том, что там происходит?

  • 1
    После перенаправления ваша роль теряется. Убедитесь, что вы сохранили его в базе данных.
  • 0
    Почему вы добавляете роль пользователю, а затем вызываете getRoles() для токена?
Показать ещё 7 комментариев
Теги:
roles
firewall
access-control

2 ответа

0
Лучший ответ

Я, наконец, обошел эту проблему, используя прослушиватель событий с событиями security.interactive_login и kernel.request.

Я установил сессию (в своем действии, зарегистрированном для события security.interactive_login) ключ и проверил событие kernel.request (улавливая каждый вызов на веб-сайт), если ключ настроен на то, чтобы сделать что-то или другое.

Надеюсь, это поможет кому-то...

0

Вы можете попробовать добавить это в ваше приложение /security.yml:

security:
    always_authenticate_before_granting: true
  • 0
    Я не сказал, что уже добавил это в свой app / security.yml. В любом случае спасибо за ответ =)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню