Symfony2角色/组 - is_granted未检测到用户拥有的角色

时间:2012-04-17 15:39:29

标签: php symfony twig

我已经按照Symfony2烹饪书(http://symfony.com/doc/current/cookbook/security/entity_provider.html)中的'如何从数据库加载安全用户(实体提供商)'配方,除了我没有使用自定义实体提供程序 - 这意味着我的User类正在使用延迟加载角色。

安全性中的防火墙/访问控制一切正常。我有一些只有ROLE_ADMIN用户可以访问的路由以及一些ROLE_USER用户可以访问的路由 - 这些工作正常。

问题是在我的基本模板中,我有一个显示如下的栏:

<p>Logged in as: {{ app.user.username }} {% if is_granted('ROLE_ADMIN') %}| <a href="{{ path('bassettprovidentia_skeleton_admindashboard') }}">Admin area</a> {% endif %}| <a href="#">Settings</a> | <a href="{{ path('bassettprovidentia_skeleton_logout') }}">Log out</a></p>

即使我的用户在数据库中具有ROLE_ADMIN角色(并且可以访问仅限于该角色的URL),也不会显示“管理区域”链接!

以同样的形式,我有这个:

<p>Roles: {% for role in app.user.roles %}{{ role.name }} [{{ role.role }}]{% if not loop.last %}, {% endif %}{% endfor %}</p>

工作正常!显示用户拥有的所有角色!

我做错了什么?

是否应该责备懒惰?

这不会引起其他地方的问题。

1 个答案:

答案 0 :(得分:20)

好的 - 我找到了答案。我无法相信这是多么明显。

app.user对象(即第二个代码段)中获取的用户角色显然是在我请求时从数据库中获取的。

is_granted()调用显然会使用会话来查看用户拥有的角色。我一直在玩耍并改变角色,同时忘记退出并再次登录 - 难怪某些角色没有显示出来。

登录和退出并玩弄不同的角色后,我可以确认一切正常。

如果我今天早上没有休息休息,我可能会在圈子里追逐几个小时;那里有一个值得吸取的教训。