Скажем, например, я предоставляю новую роль пользователю, прошедшему проверку подлинности, в контроллере, например:
$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:
Symfony \ Component \ Security \ Основные \ User \ EquatableInterface
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);