Manchmal ist es von Nöten, dass man eine bestimmte Route in einer Symfony Anwendung mit einem Passwort schützen möchte. Symfony bietet von Haus aus sehr viele Möglichkeiten ein User Management einzubinden.
Bei mir gab es jedoch den Fall, dass ich nur eine bestimmte Route mit einem Passwort schützen wollte. Und dieses auch nur für einen kurzen Zeitraum. Meine restliche Anwendung benötigte bisher keine Rechte und ich wollte für diesen temporären Einsatz den Aufwand so gering wie möglich halten.
Zum Glück bietet Symfony auch für diesen Fall eine Lösung. Die Antwort lautet Memory User Provider. Dieser Provider gehört zu den Standard Authentifizierungs-Providern, die Symfony bereitstellt.
In der Regel sollte der Memory User Provider eher sparsam eingesetzt werden, da er nicht flexibel genug ist, um ein User Management zu integrieren. Aber bei meinem Sonderfall war es genau passend.
Du benötigst nur 3 Schritte, um eine statische Route mit einem Login und einem Passwort zu schützen. Los geht’s !
Schritt 1: Symfony Security Bundle installieren
Falls du das Security Bundle nicht bereits in deiner Anwendung nutzt, musst du es zunächst installieren.
Falls du Symfony Flex nutzt, muss du nichts weiter tun, als das Bundle über Composer zu laden.
Schritt 2: Password kodieren
Als nächstes musst du das spätere Password für deinen User kodieren. Dazu bietet dir Symfony bereits einen Command.
Gehe in die Console und führe folgenden Task aus
Den Wert, den du nach Ausführen des Commands erhälst, benötigst du für den nächsten Schritt.
Schritt 3: security.yaml anpassen
Im letzten Schritt muss die Konfigurationsdatei unter config/packages/security.yaml angepasst werden.
Hier trägst du nun den Encoder, die zu verschlüsselne Route und deine User mit dem in Schritt 2 gewählten Passwort ein.
Der Encoder wird zwingend benötigt. Andernfalls wird ein Fehler geworfen. Hier reicht der Standard Encoder mit dem Wert auto.
Unter dem Attribut providers gibst du dein generiertes Passwort ein und teilst es dem User zu.
Zuletzt musst du noch deine Route in der Firewall definieren. Hier ist es /my-protected-route. Als Provider bekommt die deinen oberhalb definierten Provider zugewiesen
Das war es schon. Wenn du nun deine Seite aufrufst, solltest du einen Login-Dialog erhalten. Nur dein oben definierter User mit dem entsprechenden Password kann zugreifen.
So das war es auch schon. Ich denke nicht mal 5 Minuten oder?
9. Dezember 2021 um 14:14 Uhr
Hallo.
Bei mir scheint etwas mit der config in security.yaml nicht zu passen. Entsprechend den 3 Schritten habe ich anschließend dann die credentials im Browser eingegeben. Werde aber immer zur Loginform redirected ohne Zugriff auf die Seite zu bekommen.
9. Dezember 2021 um 15:07 Uhr
Hallo Haris, hast du noch eine andere Firewall aktiv oder ist vielleicht das Pattern für die Route nicht ganz richtig? LG Stefanie
8. April 2022 um 11:22 Uhr
tut mir leid für die späte Antwort, jetzt brauchte ich die Vorlage wieder. Ich habe das gehashte Passwort nur nicht richtig kopiert. Das wars, sonst hats prima funktioniert. Vielen Dank!
8. April 2022 um 12:15 Uhr
Prima, das freut mich. LG Stefanie
24. Juni 2024 um 11:25 Uhr
ist eine zusätzliche anpassung an den access controls nicht notwendig, um eine einzelne route zu schützen?
access_control:
– { path: ^/my-protected-route, roles: ROLE_USER }
– { path: ‚^/‘, roles: PUBLIC_ACCESS, requires_channel: https }
25. Juni 2024 um 9:50 Uhr
Hallo Phil,
da hast du Recht. In den access controls muss die Route auch aufgenommen werden. Diesen Schritt habe ich nicht notiert.
So wie du es konfiguriert hast, sollte es funktionieren.
LG Stefanie