Playframework mit CSRF: "CSRF-Token nicht in Sitzung gefunden"?

8

Ich mache ein einfaches Authentifizierungssystem mit Playframework mit ihrem integrierten CSRF-Filter und dem Security.Authenticator-System, aber ich stehe vor einem Problem:

Wenn der Benutzer sein Login / Passwort eingibt und Enter eingibt, habe ich folgenden Fehler:

  

CSRF-Token wurde in Sitzung nicht gefunden

Ich habe mein Formular überprüft und das CSRF-Token ist wirklich vorhanden und korrekt platziert (innerhalb des Tags)

Hier ist mein routes :

%Vor%

Und meine Authentication.java -Klasse:

%Vor%

Die Eigenschaften, die ich in der application.conf eingestellt habe:

%Vor%

Hier ist mein Formular (um zu zeigen, dass das Token korrekt positioniert ist):

%Vor%

Update 1 : Ich habe alle @addCSRFToken und @requireCSRFToken entfernt und stattdessen ein globales CSRF-Token pro @rhj-Empfehlung definiert. Jetzt habe ich stattdessen diesen Fehler:

  

Es wurde ein ungültiges Token im Formularhauptteil gefunden

Aber wie Sie im HTML-Formular sehen können, wird das Token innerhalb des Formulars platziert und sollte identifiziert werden!

Update 2 : Was mich am meisten stört, ist, dass dieses Problem nur auf der Anmeldeseite auftritt und nicht anderswo! Gibt es eine Sitzung zuerst zu aktivieren? Ich denke nicht, aber vielleicht?!

Update 3 : Noch seltsamer, ich habe gerade herausgefunden, dass es funktioniert, wenn ich den Wert von csrf.token.name ändere und die Seite neu lade. Wenn ich mich abmelde, eine neue Seite öffne und versuche, erneut zu loggen, scheitert es mit der Nachricht Invalid token found in form body . Wenn ich den Wert von csrf.token.name erneut ändere und es erneut tue, wird es wieder funktionieren.

Update 4 : Ich habe das Problem eingegrenzt. Ich benutze auch den play.mvc.Security.Authenticator und es scheint, dass die Token-Verifizierung NUR fehlschlägt, wenn ich die Seite nach einem redirect() zeige. Wenn ich direkt zur Anmeldeseite gehe, wird die Fehlermeldung nicht angezeigt.

Endgültiges Update! : Ich habe das Problem endlich gefunden, es war in einer anderen Klasse, die ich nicht ahnte, die aufgerufen und die Sitzung gelöscht wurde, wodurch das Token nutzlos wurde!

    
Cyril N. 01.10.2014, 07:59
quelle

2 Antworten

4

Schließlich befand sich das Problem in einem anderen Teil meines Codes, der die Sitzung in der Methode login() bereinigte und das csrf-Token damit entfernte ...

    
Cyril N. 07.10.2014, 14:58
quelle
3

Fügen Sie die folgende Zeile in Global.java

hinzu %Vor%

Dazu müssen Sie

importieren %Vor%

Hoffe das wird dir helfen

    
RKJ 07.10.2014 08:24
quelle