web-dev-qa-db-de.com

Symfony2 is_granted ('IS_AUTHENTICATED_FULLY') während der Anzeige von 404-Fehlerseiten, was zu ResourceNotFoundException führt

Ich habe benutzerdefinierte Fehlerseiten eingerichtet, die für bestimmte HTTP-Fehler im Ordner angezeigt werden:

app/Resources/TwigBundle/views/Exception/

Die Seite 403 (error403.html.twig) funktioniert und wird wie erwartet angezeigt.

Die 500-Seite (error500.html.twig) funktioniert und wird wie erwartet angezeigt.

Die 404-Seite (error404.html.twig) löst einen 500-Server-Fehler aus:

Schwerwiegender PHP-Fehler: Ungefangene Ausnahme "Symfony\Component\Routing\Exception\ResourceNotFoundException"

Der Fehler wird ausgelöst, indem eine Authentifizierungsprüfung durchgeführt wird, um bestimmte Menüelemente für Benutzer anzuzeigen, die authentifiziert sind oder nicht:

{% if is_granted('IS_AUTHENTICATED_FULLY') %}

Wenn ich dieses Häkchen entferne und nur zulasse, dass alle Menüelemente angezeigt werden, lädt die Seite die Fehlerseite wie erwartet. Auch hier wird die Seite 403 so angezeigt, wie sie sollte, und die Authentifizierungsprüfungen werden problemlos ausgeführt.

Ich stecke in diesem Fall fest. Die Seiten sind bis auf den Dateinamen genau gleich.

17
Nick

Sie können den is_granted in einer 404-Seite seit 2.1 nicht mehr verwenden:

Es ist in der Upgrade-Datei erwähnt

Der Firewall-Listener ist jetzt nach dem Router-Listener registriert. Dies bedeutet, dass für bestimmte Firewall-URLs (z. B./login_check und/logout) in Ihrer Routing-Konfiguration jetzt die richtigen Routen definiert sein müssen. Wenn Sie eine benutzerdefinierte 404-Fehlerseite haben, stellen Sie außerdem sicher, dass Sie keine sicherheitsrelevanten Funktionen wie is_granted verwenden.

Siehe: https://github.com/symfony/symfony/blob/master/UPGRADE-2.1.md#security

11
Jeroen

Wenn symfony <2.8:

{% if app.user is not null and is_granted('ROLE_ADMIN') %}

Siehe: https://github.com/symfony/symfony-docs/issues/2078

Edit vom 17. Dezember 15:

Dies wird seit 2.8 nicht mehr benötigt.

{% if is_granted('ROLE_ADMIN') %}

funktioniert jetzt gut.

quelle: http://symfony.com/blog/new-in-symfony-2-8-dx-improvements#allow-to-check-for-security-even-in-pages-not-covered-by- firewalls

15
Tseho

Ich würde vorschlagen, nach app.security.token zu suchen, um strenger zu sein, und nach true auszuwerten, selbst wenn der Benutzer anonym ist.

Wenn Sie nach app.user suchen, wird false in Ausnahmevorlagen ausgewertet, aber auch dann, wenn die Firewallvorhanden ist (= reguläre Vorlagen), der Benutzer jedoch nicht angemeldet ist. Dadurch wird beispielsweise die Anzeige einer Anmeldeschaltfläche verhindert.

Siehe: https://github.com/symfony/symfony-docs/pull/2359

2
bozma88