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

时间:2015-08-13 10:58:37

标签: symfony caching 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(成功付款)返回后,该角色会升级。

但是,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但我不完全确定它是否是我需要的。

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

1 个答案:

答案 0 :(得分:5)

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

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

另一种方法是强制用户重新进行身份验证:

$token->setAuthenticated(false);

例如,获取安全用户,添加角色,保存到db并重新验证:

...
$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.