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.
更新:似乎不是 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.