Symfony 2.3: Как обновить аутентифицированный пользователь из базы данных?

Скажем, например, я предоставляю новую роль пользователю, прошедшему проверку подлинности, в контроллере, например:

$em = $this->getDoctrine()->getManager(); $loggedInUser = $this->get('security.context')->getToken()->getUser(); $loggedInUser->addRole('ROLE_XYZ'); $em->persist($loggedInUser); $em->flush(); 

При загрузке следующей страницы, когда я снова заберу аутентифицированного пользователя:

 $loggedInUser = $this->get('security.context')->getToken()->getUser(); 

Им не предоставлена ​​роль. Я предполагаю, что это связано с тем, что пользователь хранится в сеансе и нуждается в обновлении.

Как мне это сделать?

Я использую FOSUserBundle, если это имеет значение.

Попробуй это:

 $em = $this->getDoctrine()->getManager(); $loggedInUser = $this->get('security.context')->getToken()->getUser(); $loggedInUser->addRole('ROLE_XYZ'); $em->persist($loggedInUser); $em->flush(); $token = new \Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken( $loggedInUser, null, 'main', $loggedInUser->getRoles() ); $this->container->get('security.context')->setToken($token); 

В предыдущем ответе нет необходимости сбросить токены. Просто в вашем файле конфигурации безопасности (security.yml и т. Д.) Добавьте следующее:

 security: always_authenticate_before_granting: true 

Хотя ответ принят, Symfony фактически имеет собственный способ обновления объекта User. Кредит выходит за Joeri Timmermans за эту статью .

Шаги по обновлению объекта User:

  1. Сделайте свой пользовательский объект реализованным интерфейсом

Symfony \ Component \ Security \ Основные \ User \ EquatableInterface

  1. Реализовать абстрактную функцию isEqualTo:
 public function isEqualTo(UserInterface $user) { if ($user instanceof User) { // Check that the roles are the same, in any order $isEqual = count($this->getRoles()) == count($user->getRoles()); if ($isEqual) { foreach($this->getRoles() as $role) { $isEqual = $isEqual && in_array($role, $user->getRoles()); } } return $isEqual; } return false; } 
 $user = $this->getUser(); $userManager = $this->get('fos_user.user_manager'); $user->addRole('ROLE_TEACHER'); $userManager->updateUser($user); $newtoken = new \Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken($user,null,'main', $user->getRoles()); $token = $this->get('security.token_storage')->setToken($newtoken);