2016-04-04 6 views
0

Mein Projekt ist eine völlig private Schnittstelle und Benutzer müssen sich anmelden, um einzutreten. Ich versuche das Anmeldeformular zu erstellen. Also brauche ich keinen/admin/Ordner in meiner Architektur.Symfony3 Login-Formular: wie Firewall in Security.yml parametrisieren?

Ich folgte Symfony instructions, um ein traditionelles Login-Formular zu erstellen.

Wenn ich versuche, die Homepage (oder eine andere) zu bekommen, wird es zum Anmeldeformular umgeleitet. An diesem Punkt ist alles in Ordnung.

Aber mein Problem ist, dass ich eine Umleitungsschleife auf meiner Anmeldeseite habe. Wenn ich versuche, mich anzumelden, wird es jedes Mal auf der Anmeldeseite umgeleitet, anstatt auf der Seite, die wir sehen möchten.

Ich denke, es gibt ein Problem in meiner security.yml Datei, auf der Ebene der Firewall-Konfiguration.

security.yml

Zuerst mag ich mein Login-Formular mit einem einzigen und einfachen Benutzer testen, aber zumindest werde ich Benutzer in einer Datenbank gespeichert bekommen. Es ist nur für den Test.

Der gesicherte Bereich ist meine gesamte Schnittstelle außer der Login-Seite, deshalb habe ich eine Login-Firewall (genau wie Symfony recommends it) gemacht.

security: 
    providers: 
     in_memory: 
      memory: 
       users: 
        mylogin: 
        password: mypwd 
        roles: 'ROLE_ADMIN' 

    encoders: 
     Symfony\Component\Security\Core\User\User: plaintext 

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

     login_firewall: 
      pattern: ^/login$ 
      anonymous: ~ 

     secured_area: 
      pattern: ^/ 
      provider: in_memory 
      form_login: 
       login_path: login 
       check_path: login 

       # csrf token options 
       csrf_parameter:  _csrf_token 
       csrf_token_id:  authenticate 
       csrf_token_generator: security.csrf.token_manager 

      logout: 
       path: /logout 
       target:/

    access_control: 
     - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/, roles: ROLE_ADMIN } 

Seiten Architektur:

  • /default/index.html.twig
  • /security/login.html.twig

routing.yml

login: 
    path: /login 
    defaults: { _controller: AppBundle:Security:login } 

logout: 
    path: /logout 

SecurityController.php

<?php 

namespace AppBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 

class SecurityController extends Controller 
{ 
    /** 
    * @Route("/login", name="login") 
    */ 
    public function loginAction(Request $request) 
    { 

     $authenticationUtils = $this->get('security.authentication_utils'); 

     // get the login error if there is one 
     $error = $authenticationUtils->getLastAuthenticationError(); 

     // last username entered by the user 
     $lastUsername = $authenticationUtils->getLastUsername(); 

     return $this->render(
     'security/login.html.twig', 
     array(
      'last_username' => $lastUsername, 
      'error'   => $error, 
     ) 
    ); 
    } 
} 

Wo ich falsch bin? Ich verstehe nicht, warum ich eine Umleitungsschleife auf meinem Formular habe. Außerdem, wenn ich gefälschte Login und Passwort setzen, Symfony zeigt keine Fehler, wie sie tun sollten:

login.html.twig

{% if error %} 
    <p class="bg-danger">{{ error.messageKey|trans(error.messageData, 'security') }}</p> 
{% endif %} 

ich Ratschläge benötigen, bitte helfen Sie mir ;-) Danke!

Antwort

0

ich eine Lösung gefunden ändern, die für mich funktioniert, dank this thread.

Merkwürdigerweise haben wir „anonymous: ~“ setzen in der Haupt Firewall, auch wenn wir es privat wollen ...

Jetzt, wenn ich versuche, Homepage zuzugreifen, leitet das Anmeldungsformular aus. Wenn ich mich anmelde, wird der Benutzer authentifiziert und es wird zur Startseite weitergeleitet.

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

     main: 
      pattern: ^/ 
      provider: in_memory 
      anonymous: ~ 
      form_login: 
       login_path: /login 
       check_path: /login 

       # csrf token options 
       csrf_parameter:  _csrf_token 
       csrf_token_id:  authenticate 
       csrf_token_generator: security.csrf.token_manager 

      logout: 
       path: /logout 
       target:/

    access_control: 
     - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/, roles: ROLE_ADMIN } 
+0

Ich habe das gleiche Problem, mit Ihrer Lösung habe ich einen Fehler beim Übermitteln des Formulars: Ungültiges CSRF-Token. Ich verstehe wirklich nicht, was das Problem ist !! – Sam

+0

Haben Sie das CSRF-Feld in Ihrem Anmeldeformular hinzugefügt? Sie sollten dies lesen: http://symfony.com/doc/current/security/csrf_in_login_form.html – Felurian

0

Hallo @Felurian Ihr check_path muss hinter Ihrer Firewall sein.

Für Ihre Firewall sollten Sie

main: 
     pattern: ^/ 
     anonymous: false 


      form_login: 
      login_path: /login 
      check_path: /login_check 

und

access_control: 
    - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
+0

Ich habe Ihre Lösung versucht, aber es löst das Problem nicht. Muss ich meine "login_firewall" löschen und meinen Code anstelle meines "secured_area" eingeben? – Felurian