Symfony2 身份验证角色未在 TWIG 模板中更新

Symfony2 authentication roles not updating in TWIG template

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

我在 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 return(付款成功)后角色升级。

但是,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 缓存无关。 当您使用新角色更新数据库时,会话仍然保留用户登录时分配的旧角色。最简单的解决方案是通过重新生成会话 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.