15

たとえば、次のように、コントローラーで現在認証されているユーザーに新しいロールを付与するとします。

$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 を使用しています。

編集: この質問は、もともと Symfony バージョン 2.3 のコンテキストで尋ねられましたが、以下の最近のバージョンに対する回答もあります。

4

5 に答える 5

23

これを試して:

$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);
于 2013-10-31T22:19:58.877 に答える
15

前の回答でトークンをリセットする必要はありません。セキュリティ設定ファイル (security.yml など) に、次のように追加します。

security:
    always_authenticate_before_granting: true
于 2015-02-28T12:47:39.153 に答える