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!
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
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