Обновляйте роли в контексте security.context без необходимости повторного входа в систему


Я использую FOSUserBundle в своем проекте. У меня есть контроллер AcmeArticleBundle:Edit, который имеет префикс маршрута /editor. И в моей безопасности.в yml я добавил контроль доступа.

access_control:
    - { path: ^/editor/, role: ROLE_EDITOR }

Теперь я добавляю ROLE_EDITOR пользователю в контроллере. Но пользователь не может получить доступ к AcmeArticleBundle:Edit, и контекст безопасности не изменится до выхода из системы и повторного входа в систему.

Author: Mohebifar, 2014-05-13

2 answers

Вы можете обновить роли вручную:

// YourController.php
$roles = $this->getToken()->getUser()->getRoles();
$roles[] = 'ROLE_NEW';
$this->getToken()->getUser()->setRoles($roles);
// Then persist your user entity or the new role will be lost at the next page call

(Код для Symfony2.0, но он не должен сильно отличаться в 2.4)

 1
Author: COil, 2014-05-13 07:52:15

Наконец-то я нашел решение. Мне пришлось создать новый маркер безопасности и установить его в качестве контекста безопасности.

$user = $this->getUser();
$user->addRole('ROLE_ADMIN');
$this->get('fos_user.user_manager')->updateUser($user);
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->get('security.context')->setToken($token);
 0
Author: Mohebifar, 2014-06-24 09:18:01