Подтвердить что ты не робот

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, если это имеет значение.

4b9b3361

Ответ 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

  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;
}

Ответ 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 {
            //...
        }
    }