Symfony2 is_granted ('IS_AUTHENTICATED_FULLY') во время 404 отображения страницы ошибки, вызывая ResourceNotFoundException
У меня есть настраиваемые страницы ошибок для отображения определенных HTTP-ошибок в папке:
app/Resources/TwigBundle/views/Exception/
Страница 403 (error403.html.twig
) работает и отображается как ожидалось.
Страница 500 (error500.html.twig
) работает и отображается как ожидалось.
Страница 404 (error404.html.twig
) выдает ошибку сервера 500:
PHP Неустранимая ошибка: исключение "Symfony\Component\Routing\Exception\ResourceNotFoundException"
Ошибка вызывается при выполнении проверки подлинности для отображения определенных пунктов меню для пользователей, которые не аутентифицированы:
{% if is_granted('IS_AUTHENTICATED_FULLY') %}
Если я удалю эту проверку и просто разрешу отображение всех элементов меню, страница загружает страницу с ошибкой, как ожидалось. Опять же, страница 403 отображается так, как должна, и использует проверки проверки подлинности без проблем.
Я застрял на этом. Страницы ТОЧНО одинаковы, кроме имени файла.
Ответы
Ответ 1
Вы не можете использовать is_granted
на странице 404, поскольку 2.1:
Он упоминается в файле обновления
Слушатель брандмауэра теперь зарегистрирован после прослушивателя маршрутизатора. Это означает, что определенные URL-адреса брандмауэра (например,/login_check и /logout ) теперь должны иметь соответствующие маршруты, определенные в конфигурации маршрутизации. Кроме того, если у вас есть страница ошибки 404, убедитесь, что вы не используете никаких связанных с ней функций, таких как is_granted
.
См:
https://github.com/symfony/symfony/blob/master/UPGRADE-2.1.md#security
Ответ 2
Если symfony < 2.8:
{% if app.user is not null and is_granted('ROLE_ADMIN') %}
Смотрите: https://github.com/symfony/symfony-docs/issues/2078
Изменить с 17 декабря 15:
Это больше не требуется с 2.8,
{% if is_granted('ROLE_ADMIN') %}
теперь работает нормально.
источник: http://symfony.com/blog/new-in-symfony-2-8-dx-improvements#allow-to-check-for-security-even-in-pages-not-covered-by-firewalls
Ответ 3
Я бы предложил проверить app.security.token
на более строгую и оценить true
, даже если пользователь анонимен.
Если вы проверите app.user
, он будет оценивать false
в шаблонах исключений, но даже если присутствует брандмауэр (= обычные шаблоны), но пользователь не регистрируется. Это предотвратит, например, отображение кнопки входа.
Смотрите: https://github.com/symfony/symfony-docs/pull/2359