【问题标题】:Symfony2 authentication roles not updating in TWIG templateSymfony2 身份验证角色未在 TWIG 模板中更新
【发布时间】:2015-11-06 07:24:20
【问题描述】:

更新:似乎不是 twig 缓存,但 twig 直到几分钟后才识别新添加的角色(在生产模式下)。

我在 Symfony2 应用程序中有一个 twig 模板,它可以像这样检查用户的角色:

{% if is_granted('ROLE_PLATINUM_MEMBER') %}
    <span>YOU ARE A PLATINUM MEMBER</span>
{% elseif is_granted('ROLE_MEMBER') %}
    <span>YOU ARE A NORMAL MEMBER</span>
{% endif %}

从 PayPal 退货(支付成功)后角色升级。

但是,twig 仍然显示YOU ARE A NORMAL MEMBER(仅在生产模式下)。 如果用户注销并重新登录,则会显示正确的角色。

这让我认为它是树枝缓存。我认为这不是 Symfony,因为如果我导航到包含与上述相同代码的页面(在转到 PayPal 之前我没有访问过),那么会显示 YOU ARE A PLATINUM MEMBER

我看过at this answer for flushing the twig cache,但是设置:

twig:
    cache: false

对生产模式不利。

有没有办法以编程方式刷新它? 我找到了this flush command,但不完全确定它是否是我需要的。

也许我需要使用一些代码来获取用户并检查角色,而不仅仅是检查角色?

【问题讨论】:

  • 我认为这与树枝缓存无关。尝试重新加载用户。是的,关闭树枝缓存不是一个好主意。
  • 如果不是 twig 的东西,那么我不知道为什么我之前没有在去 paypal 之前加载的 twig 模板显示正确的提升 ROLE
  • 它与Twig无关,当你为用户添加角色时,你可以在安全内容中刷新用户:$this->get('security.context')->getToken()->setUser($用户);
  • 似乎不起作用,在角色更改之前(从贝宝返回之前)加载的树枝模板仍然显示“普通会员”
  • 还有一件事要尝试:$this-&gt;get('session')-&gt;migrate();

标签: symfony caching twig


【解决方案1】:

正如我在评论中所说,与 Twig 缓存无关。 当您使用新角色更新数据库时,会话仍然保留用户登录时分配的旧角色。最简单的解决方案是通过重新生成会话 ID 来刷新会话:

$this->get('session')->migrate();

另一种方法是强制用户重新认证:

$token->setAuthenticated(false);

例如获取安全用户、添加角色、保存到数据库并重新验证:

...
$token = $this->get('security.token_storage')->getToken();
$user = $token->getUser();
$user->addRole('ROLE_PLATINUM_MEMBER');
$dm->flush();
$token->setAuthenticated(false);

这样我们就有了新的用户会话,所有角色之前都保存到了数据库中。

//If we check for user role:
$this->get('security.authorization_checker')->isGranted('ROLE_PLATINUM_MEMBER');
//This return true.

【讨论】:

  • 感谢马尔科姆,不能在 19 小时内奖励赏金,所以到时会这样做!
  • 谢谢。我很高兴能帮上忙。
  • @malcolm @timhc22 您使用哪种会话存储非常有趣?基本NativeSessionStorage 的原因不应该工作 - 在迁移时,它会使用过时的UsernamePasswordToken 复制上一个会话的数据。至少我看到的代码和我的测试是这样说的。我建议将$token-&gt;setAuthenticated(false); 算作您问题的可靠解决方案,而不是迁移。
  • 我使用 mongodb,在我的情况下创建了新的会话文档,但你是对的,我没有在默认 Symfony 安装中测试它,我的错。
  • @malcolm 问题有问题github.com/symfony/symfony/issues/12025 我想如果您将链接添加到您的答案中,这将对世界有用:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
  • 2012-08-28
  • 2016-12-22
  • 1970-01-01
相关资源
最近更新 更多