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