2013-08-23 5 views
6

Ich habe einen Admin-Bereich mit Login, die wir auf https: // erzwingen. Wenn die route/admin gefunden wird, sollte auf die Anmeldeseite umgeleitet werden, wenn der Benutzer nicht angemeldet ist, aber ich bekomme eine endlose Redirect-Schleife. Nicht sicher, was falsch ist, hier ist security.yml:Redirect Schleife des Todes in Symfony2 Sicherheit

firewalls: 
     admin_login: 
      pattern: ^/admin/secured/login$ 
      security: false 

     admin_secured_area: 
      pattern: ^/admin 
      provider: entity_admin 
      form_login: 
       check_path: /admin/secured/login_check 
       login_path: /admin/secured/login 
       default_target_path: /admin 
      logout: 
       path: /admin/secured/logout 
       target:/

    access_control: 
     - { path: ^/admin/secured/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 
     - { path: ^/admin, roles: ROLE_ADMIN, requires_channel: https } 

Danke für Ihre Hilfe!

+1

haben Sie versucht, admin_login zu entfernen? von deiner Firewall-Sektion? – ILikeTacos

+0

Hallo laut den Dokumenten brauche ich admin_login, um anonymen Benutzern Zugriff auf das Login-Formular zu ermöglichen. Ich habe versucht, auch zu entfernen, und es leitet weiter um. Trotzdem danke! – Acyra

+0

Bitte teilen Sie mit, welche Seiten weitergeleitet werden sollen? –

Antwort

3

Hallo, so ist dies auf die Art und Weise zusammen, dass Symfony2 $request->isSecure() Kontrollen für SSL, wenn die Website unter einem Load-Balancer ist, gibt es einige inkonsistenten Header-Namen in PHP. Die Konfigurationsdatei muss die folgende:

trusted_proxies: [10.0.0.0/8] 

Es funktioniert jetzt, aber ich weiß nicht, ob es allerdings Probleme mit der Sicherheit dieser Einstellung ist.

+1

Als Nebenbemerkung müssen Sie sicherstellen, dass Sie den richtigen Header vom Proxy weiterleiten. Symfony prüft, ob 'X_FORWARDED_PROTO' = 'https', 'on', 'ssl' oder '1' ist. Sie können diese Variable durch var_dump $ _SERVER in app.php oder app_dev.php – DIMMSum

+0

Hi Decave sehen, können Sie auf Ihren Kommentar näher eingehen? Welchen Code benötigen wir, um den korrekten Header vom Proxy zu erhalten? Vielen Dank! – Acyra

+1

Sie müssen Ihren Proxy so konfigurieren, dass er, wenn er eine Anfrage über https vom Browser erhält, eine '$ _SERVER'-Variable weiterleitet, die anzeigt, dass er die Anfrage über https erhalten hat. Kennen Sie die Funktionsweise von Proxys? Wenn ein Proxy eine Anfrage über https erhält, leitet er diese Anfrage manchmal über http an den Webserver weiter. Der Webserver hat daher keine Möglichkeit zu wissen, ob die Ursprungsanforderung https war, daher muss der Proxy stattdessen eine '$ _SERVER'-Variable als Referenz weiterleiten. Die '$ _SERVER'-Variable, die Symfony überprüft, ist' X_FORWARDED_PROTO'. Ist das sinnvoll? – DIMMSum

2

^/admin/secured/login_check sollte anonym auch authentifiziert werden, da Benutzer keine Rolle haben, wenn sie diese Seite ursprünglich aufrufen, daher die Schleife.

+0

Hallo danke für den Vorschlag. Ich habe das versucht und es schlägt immer noch fehl. Außerdem müssen anonyme Benutzer in login_check nicht in den Dokumenten angemeldet sein, und die Anmeldung funktioniert einwandfrei, wenn https nicht erzwungen wird. Danke für den Vorschlag. Ich werde weiter daran arbeiten! – Acyra

4

Nach kurzem Blick würde ich sagen, dass so etwas wie dies unten sollte korrekt sein:

firewalls: 
    admin_secured_area: 
     pattern: ^/admin 
     provider: entity_admin 
     form_login: 
      check_path: /admin/secured/login_check 
      login_path: /admin/secured/login 
      default_target_path: /admin 
     logout: 
      path: /admin/secured/logout 
      target:/

access_control: 
    - { path: ^/admin/secured/(login|login_check|logout)$, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 
    - { path: ^/admin, roles: ROLE_ADMIN, requires_channel: https } 

Wie auch immer, wenn dies nicht helfen, empfehle ich die Umleitungen mit eingebautem in Profiler (Tabs mit Routenübereinstimmungen zu überprüfen und Stamm), es auf den Umleitungen drehen config_dev.yml ändern: in Firewalls

web_profiler: 
    toolbar: true 
    intercept_redirects: true 
+0

Meine Header in der Anfrage hatte die HTTPS auf aus eingestellt, auch wenn tatsächlich tun https ... Problem war Nginx Config nicht Symfony, intercept_redirects: true ... half mir, es zu finden .. – Drmjo

6

keine Notwendigkeit für einen "admin_login" Abschnitt. Aber es sieht aus wie Sie den anonymen Parameter vergessen ..

firewalls:  
     admin_secured_area: 
      anonymous: ~ 
      pattern: ^/admin 
      provider: entity_admin 
      form_login: 
       check_path: /admin/secured/login_check 
       login_path: /admin/secured/login 
       default_target_path: /admin 
      logout: 
       path: /admin/secured/logout 
       target:/

    access_control: 
     - { path: ^/admin/secured/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 
     - { path: ^/admin, roles: ROLE_ADMIN, requires_channel: https } 

Wie ich in meinem Kommentar sagte, legen Sie ROLE_ADMIN Rolle für angemeldete Benutzer?

EDIT: Ist Ihr Routing State HTTPS-Kanal auch für den Admin-Bereich?

+0

Hallo vielen Dank noch einmal für Ihre Hilfe. Sie müssen https nicht im Routing festlegen, wie wir es in access_control festgelegt haben. – Acyra

+2

Ich hatte ein ähnliches Problem und für mich arbeitete ich 'anonymous: ~' zu 'admin_secured_area'. –

2

Entfernen:

admin_login: 
      pattern: ^/admin/secured/login$ 
      security: false 
Verwandte Themen