Symfony: Get logged user in 404 Error Page


November 2018


954 time


I'm trying to get the username of logged user in the 404 error page, like the symfony docs says;

{# app/Resources/TwigBundle/views/Exception/error404.html.twig #}
{% extends 'base.html.twig' %}

{% block body %}
    <h1>Page not found</h1>

    {# example security usage, see below #}
    {% if is_granted('IS_AUTHENTICATED_FULLY') %}
            IS_AUTHENTICATED_FULLY: {{ app.user.username }}
    {% endif %}

    {% if is_granted('IS_AUTHENTICATED_REMEMBERED') %}
            IS_AUTHENTICATED_REMEMBERED: {{ app.user.username }}
    {% endif %}

    {% if app.user %}
            app.user: {{ app.user.username }}
    {% endif %}

        The requested page couldn't be located. Checkout for any URL
        misspelling or <a href="{{ path('homepage') }}">return to the homepage</a>.
{% endblock %}

Everything works in dev, but in production the user is always not logged. Every if condition fails.

In this discussion I found this:

The cause of this problem is that routing is done before security. If a 404 error occurs, the security layer isn't loaded and thus

So... can be possible to get the logged user in twig exception page?


It looks like it is a desired behavior:

This hack can "solve" but it is really ugly...

2 answers


EDIT : К сожалению , это работает для всех страниц ошибок , за исключением 404 , так что это не правильный ответ. Оставляя это только в качестве ссылки.

Оригинальный ответ : Это работает для меня:

{% if app.user %}
    {{ app.user.username }}
{% endif %}

is_granted('IS_AUTHENTICATED_FULLY') будет справедливо только тогда, когда вы вошли в этой сессии:

IS_AUTHENTICATED_FULLY на самом деле сильнее. У вас есть только если вы действительно вошли в ходе этой сессии. Если вы вошли в систему из - за меня помните печенья, вы не будете иметь это;


Единственное решение, которое я нашел до сих пор это:

routing.yml (это должно быть последним правилом)

    pattern:  /{path}
    defaults: { _controller: MyContentBundle:PageNotFound:pageNotFound, path: '' }
        path: .*

действие контроллера

public function pageNotFoundAction()
        throw new NotFoundHttpException();


Я надеюсь найти лучшее решение