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

Я динамически добавляю роль своему пользователю сразу после того, как он вошел в систему, используя 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 реализует класс EquatableInterface класс и сделал 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

Решение

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

security:
always_authenticate_before_granting: true
0

Другие решения

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

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

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

0