Роли/группы Symfony2 - is_granted не определяет роли, которые пользователь имеет

Я следил за "Как загрузить пользователей безопасности из базы данных (поставщика сущностей)" из книги по приготовлению 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

Хорошо. Я нашел ответ. Я не могу понять, насколько это очевидно.

Пользовательские роли, взятые из объекта app.user (т.е. второго фрагмента), очевидно, берутся из базы данных как и когда я их запрашиваю.

В вызове is_granted() явно используется сеанс, чтобы узнать, какие роли у пользователя есть. Я играл и менял роли, забыв при этом выйти и снова - не удивительно, что некоторые роли не показывались.

После входа в систему и выхода из нее с разными ролями я могу подтвердить, что все работает нормально.

Если бы я не сделал перерыва и не вернулся сегодня утром, я мог бы часами сидеть за кругами; там есть урок.