2016-07-15 4 views
2

Ich versuche, meine Abmeldefunktion mit Symfony 3.1 zu erledigen, aber es funktioniert bisher nicht. Ich befolge die Buchdokumentation Schritt für Schritt, aber alles, was ich bekomme, ist eine nicht gefundene Ausnahme:Symfony 3.1: Der Controller für den Pfad "/ logout" konnte nicht gefunden werden.

Der Controller für den Pfad "/ Logout" konnte nicht gefunden werden. Die Route ist falsch konfiguriert.

ich tun, um die richtigen Konfigurationsparameter (Logout) in der security.yml Datei

security: 
     firewalls: 
     # disables authentication for assets and the profiler, adapt it according to your needs 
      dev: 
       pattern: ^/(_(profiler|wdt)|css|images|js)/ 
       security: false 

      main: 
       anonymous: ~ 
       # activate different ways to authenticate 
       form_login: 
        login_path: login 
        check_path: login 
      secured_area: 
       anonymous: ~ 
       logout: 
        path: /logout 
        target:/

aktivieren Und ich tun, um eine Route innerhalb routing.yml erstellen:

logout: 
    path: /logout 

Und das ist es Gemäß der Dokumentation wird kein Controller benötigt, aber die Ausnahmen sagen, dass der Controller-Pfad falsch ist.

Was mache ich falsch?

Antwort

3

Ich denke, es ist, weil Sie zwei Firewalls definiert haben. Für den Moment loszuwerden, das secured_area Zeugs und versuchen, so etwas wie:

firewalls: 
    dev: 
     pattern: ^/(_(profiler|wdt)|css|images|js)/ 
     security: false 

    main: 
     pattern: ^/ 
     anonymous: ~ 
     switch_user: true 

     form_login: 
      provider:   user_provider 
      login_path:   user_login 
      check_path:   user_login_check 
      default_target_path: app_welcome 

      username_parameter: username 
      password_parameter: password 

      csrf_parameter:  _csrf_token 
      csrf_token_id:  authenticate 
      csrf_token_generator: security.csrf.token_manager 

     logout: 
      path: user_logout 
      target: app_welcome 

Beachten Sie, dass der Logout-Abschnitt unter dem Haupt-Firewall ist. Sobald die Haupt-Firewall funktioniert, können Sie versuchen, den Bereich secured_area wieder hinzuzufügen, wenn Sie ihn wirklich brauchen.

Und ja, ich wurde faul und kopierte einfach eine funktionierende Konfiguration. Sie müssen die Routen anpassen, um Ihre zu passen.

+0

Nach ein paar Änderungen (ich csrf Sachen und den Anbieter entfernen) hat es funktioniert!Aber warum wird der gesicherte Bereich in der Dokumentation verwendet? Danke! – Jotaeme

+0

Ich kann die Verwirrung verstehen. Die Konfiguration der Sicherheitskomponente kann eine Herausforderung darstellen. Und die Dokumentation ist nicht 100% konsistent. Erwägen Sie, zur Dokumentation beizutragen: http://symfony.com/doc/current/contributing/documentation/overview.html – Cerad

0

Da Sie wahrscheinlich keinen Controller mit dieser Route verbunden haben. Wenn Sie ein Bundle wie FOSUser verwenden, müssen Sie nur die routing.yml des Bundles importieren. Wenn Sie kein Bündel/Controller haben, um sich um diese Route zu kümmern, müssen Sie eines implementieren.

+2

In der Tat habe ich keinen Controller mit dieser Route verbunden, da das Kochbuch sagt, dass (ein Controller) nicht benötigt wird. – Jotaeme

0

Um die Antwort von Cerad genauer zu beschreiben: Ein Sicherheitsbenutzer in Symfony ist an einen "Sicherheitskontext" gebunden, der standardmäßig einer Firewall entspricht. In Ihrem Fall möchten Sie sich aus dem Kontext ("Firewall") abmelden, für den Sie die Authentifizierungsanforderung form_login erzwungen haben. Daher muss Ihre Abmeldekonfiguration auf der "Haupt" -Firewall und nicht auf einer neuen namens " secured_area ".

Die Dokumentation verwendet den Firewallnamen "secured_area" lediglich als Hinweis darauf, dass diese Konfiguration in einer Firewall verwendet werden soll, die einen Teil Ihrer Website sichert. Es ist nicht beabsichtigt, dass Sie diesen Namen wörtlich in Ihre Konfiguration kopieren. In Ihrem Fall wird die Firewall, die Sie sichern möchten, "main" genannt. In diesem Sinne ist das documentation ein wenig verwirrend, weil es überall nur eine Firewall namens "main" für seine Beispiele verwendet, einschließlich für Beispiele, wo es einen gesicherten Bereich einrichtet. Ich denke, es wäre besser, wenn in diesem Beispiel "main" verwendet wird.

Darüber hinaus müssen Sie sicherstellen, dass die Abmelderoute (Pfad) tatsächlich von der Firewall gehandhabt wird, für die Sie sie konfiguriert haben, anstatt von einer anderen Firewall "abgefangen" zu werden. In Ihrem Fall passiert das automatisch, weil Sie Ihrer "Haupt" -Firewall keine Pfadbeschränkung auferlegt haben und so alles fängt.

Verwandte Themen