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



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

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

{% 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就会显示。

我已经查看了这个问题的答案,但是设置:

twig:
    cache: false

将不利于生产模式。

是否有任何方法以编程方式刷新?我发现了这个flush命令,但我不完全确定它是否是我需要的。

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

正如我在评论中所说的,没有任何与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.

最新更新