2017-07-10 1 views
1

Anmerkung: Ich bin Framework zu Spielenpost-Methode 403 verbotene Seite Rendering statt Ausführung post-Methode Code

dieses video tutorial and playlist Mit schaffe ich eine einfache Webapp zu erstellen.

Problem:

POST Methoden in Routen Datei scheinen nicht den erforderlichen POST Code auszuführen.

Wenn Sie die routes-Datei unten angeben, wird bei der Suche nach localhost:{port}/user/register ein GET angefordert, wodurch die register view gerendert und zurückgegeben wird.

Ausfüllen der register view Felder und submit klicken, aktualisiert die Seite (durch die Eingabefelder Clearing) und zeigt die erwartete „registriert“ text

Wenn method="post" zum form hinzugefügt wurde im register view, ein sofortige 403 Forbidden page Seite wird angezeigt.

Warum wird nicht der "registrierte" Text angezeigt, was fehlt mir (falsch gemacht)?

Routen-Datei:

GET  /     controllers.HomeController.index 

GET  /user     controllers.LoginController.index() 
GET  /user/login   controllers.LoginController.login() 
POST  /user/login   controllers.LoginController.doLogin() 
GET  /user/register  controllers.LoginController.register() 
POST  /user/register  controllers.LoginController.doRegister() 

# Map static resources from the /public folder to the /assets URL path 
GET  /assets/*file   controllers.Assets.versioned(path="/public", file: Asset) 

Controller:

HomeController 
LoginController 

LoginController Methoden:

public Result index() { return ok(views.html.user.index.render(User.getAllUsers())) } 
public Result login() { return ok(login.render()); } 
public Result doLogin() { return ok("registered"); } 
public Result register() { return ok(register.render()); } 
public Result doRegister() { return ok("registered"); } 

Register anzeigen:

@() 

<html> 
    <head> 
     <title>Register new User</title> 
    </head> 
    <body> 
     <h1>Register User</h1> 
     <br> 
     <br> 
     Enter Email Address: <input type="password" name="confirmPassword"> 
     Enter Password: <input type="password" name="confirmPassword"> 
     Confirm Password: <input type="password" name="confirmPassword"> 
     <br> 
     <br> 
     <form action="@routes.LoginController.doRegister()"> 
      <input type="submit" value="Register"/> 
     </form> 
    </body> 
</html> 

Console Ausgabefehler:

[warn] p.filters.CSRF - [CSRF] Check failed because no or invalid token found in body 
[warn] p.filters.CSRF - [CSRF] Check failed with NoTokenInBody 

Antwort

4

Ich glaube, Sie richtig sind, müssen Sie die HTTP-Methode (GET oder POST) definieren, verwendet werden, wenn die Formulardaten übermitteln.

Es ist möglich, sind Sie Forbidden gesehen, weil „Standardmäßig wird die Wiedergabe einer CSRF benötigen überprüfen“ See here?

Fügen Sie die CSRF-Token wie folgt auf die Anfrage:

@import helper._ 

<form method="post" action="@CSRF(routes.LoginController.doRegister())"> 
    ... 

Oder im Körper Das Formular:

<form method="post" action="@routes.LoginController.doRegister()"> 
    @CSRF.formField 
    ... 
+1

Ich habe umfangreiche Lektüre zu diesem Thema (Filter, etc), um eine bessere Idee zu bekommen, was das Problem verursacht. Ich habe in der Dokumentation festgestellt, dass es eine Option gibt, die CSRF-Prüfung für eine bestimmte Route zu deaktivieren. Dies geschieht, indem man '+ nocsrf' über die' post'-Route in der routes-Datei setzt (für jede 'post'-Methode muss man den CSRF-Filter umgehen). Ich sollte deine vorgeschlagene Methode anwenden, um den CRSF-Filter einzuschließen, Da es ein wenig vage war. Danke! – KGCybeX

+0

@KGCybeX, das funktioniert - aber ist eine Umgehungslösung und entfernt die Sicherheit, die die CSRF bietet. Wenn Sie jemals bereitstellen, sicher sein, dass das CSRF-Token dort mit der Überprüfung, wenn Sie ' um einen sensiblen POST zu machen. – NateH06

Verwandte Themen