2012-04-17 39 views
11

我遵循'如何從數據庫(實體提供程序)'的Symfony2烹飪書(http://symfony.com) /doc/current/cookbook/security/entity_provider.html),除非我不使用自定義實體提供程序 - 這意味着我的用戶類使用延遲加載角色。Symfony2角色/組 - is_granted沒有檢測到用戶擁有的角色

安全防火牆/訪問控制一切正常。我有一些只有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角色(並且可以訪問被限制到該網址角色),「管理區域」鏈接沒有被顯示!

在相同的形式,我有這樣的:

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

它工作正常!顯示用戶所有的角色!

我在做什麼錯?

是懶惰加載責任?

這不會導致問題的其他地方。

+1

那麼當你急切地在用戶提供者中加載角色時會發生什麼? – Cerad 2012-04-17 21:56:44

回答

18

好的 - 我找到了答案。我不能相信它有多明顯。

app.user對象(即第二個片段)中抽取的用戶角色顯然是在我請求它們時從數據庫中提取的。

is_granted()調用顯然使用會話來查看用戶具有的角色。我一直在玩耍和改變角色,同時忘記註銷並重新登錄 - 難怪某些角色沒有顯示出來。

登錄和註銷並使用不同的角色後,我可以確認它一切正常。

如果我沒有休息一下,今天早上回來,我可能會在圈子裏追逐自己幾個小時;那裏有一個教訓。

+0

你救了我的一天,謝謝你! – Moonchild 2014-10-28 16:49:47

+0

請注意,這對配置中和控制器內的訪問控制和防火牆都是一樣的。 – 2015-09-22 18:37:52

+0

謝謝你!這個問題太不誠實了,我不知道爲什麼它發生了像30分鐘... – Cowwando 2016-05-05 08:54:48