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, если это имеет значение.
Ответы
Ответ 1
Попробуйте следующее:
$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);
Ответ 2
В предыдущем ответе нет необходимости в токене reset. Просто в вашем файле конфигурации безопасности (security.yml и т.д.) Добавьте следующее:
security:
always_authenticate_before_granting: true
Ответ 3
В то время как ответ принят, Symfony фактически имеет собственный способ обновления объекта User. Кредит выходит на Joeri Timmermans для этой статьи.
Шаги по обновлению объекта User:
- Сделайте свой пользовательский объект реализованным интерфейсом
Symfony\Component\Security\Основные\User\EquatableInterface
- Реализовать абстрактную функцию 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;
}
Ответ 4
$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);
Ответ 5
В Symfony 4
public function somename(ObjectManager $om, TokenStorageInterface $ts)
{
$user = $this->getUser();
if ($user) {
$user->setRoles(['ROLE_VIP']); //change/update role
// persist if need
$om->flush();
$ts->setToken(
new PostAuthenticationGuardToken($user, 'main', $user->getRoles())
);
//...
} else {
//...
}
}