11

Symfony2 クックブック (http://symfony.com/doc/current/cookbook/security/entity_provider.html) の「データベースからセキュリティ ユーザーをロードする方法 (エンティティ プロバイダー)」のレシピに従いました。 Custom Entity Provider を使用していない - これは、私の 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>

それはうまくいきます!ユーザーが持っているすべてのロールが表示されます!

私は何を間違っていますか?

遅延読み込みが原因ですか?

他の場所で問題を引き起こしているわけではありません。

4

1 に答える 1

20

わかりました-答えを見つけました。それがどれほど明白だったか信じられません。

app.userオブジェクト(つまり、2番目のスニペット)から取得されたユーザーロールは、要求したときにデータベースから取得されます。

呼び出しはis_granted()明らかにセッションを使用して、ユーザーがどのような役割を持っているかを確認します。ログアウトして再度ログインするのを忘れながら、遊んだり役割を変更したりしていました。特定の役割が表示されなかったのも不思議ではありません。

ログインとログアウトを行い、さまざまな役割を試してみると、すべて正常に機能していることを確認できます。

もし私が休憩を取って今朝戻ってこなかったら、私は何時間も輪になって自分を追いかけていたかもしれません。そこで学ぶべき教訓があります。

于 2012-04-18T06:14:31.320 に答える