2017-07-10 11 views
1

ノートを実行する:私はこのvideo tutorial and playlistを使用したフレームワークpostメソッド403禁断のページをレンダリングする代わりにPOSTメソッドのコード

を再生するには新しいです、私は、単純なWebアプリケーションを作成するために管理します。

問題:routesファイル内

POST方法が必要とPOSTコードを実行していないようです。

以下のルートファイルを指定すると、localhost:{port}/user/registerにアクセスすると、GETが要求され、register viewがレンダリングされて返されます。

register viewフィールドに記入し、submitをクリックすると、(入力フィールドをクリアしてから)ページを更新し、method="post"register viewformに追加されている場合に期待される「登録」テキスト

を示してい、即時403 Forbidden pageページが表示されます。

「登録された」テキストが表示されないのはなぜですか、何が間違っている(間違っている)のですか?

ルートファイル:

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) 

コントローラ:

HomeController 
LoginController 

LoginController方法:

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"); } 

登録ビュー:

@() 

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

コンソール出力誤差:

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

答えて

4

は、私は、フォームデータを提出したときに使用されるHTTPメソッドを(GETまたはPOST)を定義する必要がありますあなたが正しいだと思います。

@import helper._ 

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

かのボディに:

ので、それはあなたがForbiddenを見ていることが可能ですSee here?

このような要求にCSRFトークンを追加「をデフォルトでは、プレイはCSRFが必要になりますチェック」形式:

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

私は、この問題(フィルタなど)に関する詳細な情報を読んで、問題の原因となっているものをもっと詳しく知りました。私は文書に気づいたが、特定のルートのCSRFチェックを無効にするオプションが存在する。これはルートファイルの 'post'ルートの上に' + nocsrf'を置くことによって行われます( 'post'メソッドごとにCSRFフィルタのバイパスが必要です)。あなたのCRSFフィルタをインクルードし、それはちょっとしたことだったので、ありがとう! – KGCybeX

+0

@KGCybeXは動作しますが、回避策であり、CSRFが提供する安全性を取り除いています。展開した場合は、機密性の高いPOSTを行っています。 – NateH06

関連する問題