2016-01-14 3 views
1

Я динамически добавляю роль своему пользователю сразу после входа в систему, используя прослушиватель AuthenticationSuccessHandlerInterface.Ошибка Symfony2 isGranted ('MY_ROLE') возвращает true, но возвращает брандмауэр 403

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

После перенаправления ваша роль будет потеряна. Убедитесь, что вы сохранили его в базе данных. – Valdas

+0

Почему вы добавляете роль пользователю, но затем вызываете 'getRoles()' на токен? – xabbuh

+0

@xabbuh Потому что он хочет посмотреть, правильно ли установлена ​​роль для пользователя. – KhorneHoly

ответ

0

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

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

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

0

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

security: 
    always_authenticate_before_granting: true 
+0

Я не сказал что я уже добавил это в свое приложение/security.yml. В любом случае спасибо за ответ =) – LordWeedlle

Смежные вопросы