Я динамически добавляю роль своему пользователю сразу после того, как он вошел в систему, используя 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 }
Я уже пытался установить в классе роль (в коде не динамически), она работает, так что мой брандмауэр работает, за исключением динамически устанавливаемых данных, даже если я перезагружаю пользователя.
Есть идеи о том, что там происходит?
Вы можете попробовать добавить это в ваш app / security.yml:
security:
always_authenticate_before_granting: true
Я наконец обошел проблему, используя прослушиватель событий с security.interactive_login
а также kernel.request
События.
Я установил в сессии (в моем действии, зарегистрированном для security.interactive_login
событие) ключ и регистрация kernel.request
событие (перехват каждого звонка на сайт), если ключ настроен на то или иное действие.
Надеюсь, что это может кому-то помочь …