【问题标题】:post method rendering 403 forbidden page instead of executing post method codepost方法渲染403禁止页面而不是执行post方法代码
【发布时间】:2017-12-14 12:50:00
【问题描述】:

注意:我是 Play 框架的新手

使用这个video tutorial and playlist,我设法创建了一个简单的网络应用程序。

问题:

路由文件中的POST 方法似乎没有执行所需的 POST 代码。

给定下面的路由文件,浏览到localhost:{port}/user/register 请求GET,从而渲染并返回register view

填写register view 字段,然后单击submit,刷新页面(通过清除输入字段)并显示预期的“注册”文本

如果method="post" 已添加到register view 中的form,则会立即显示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

【问题讨论】:

    标签: scala playframework playframework-2.0 sbt


    【解决方案1】:

    我认为您是正确的,您需要定义提交表单数据时要使用的 HTTP 方法(GET 或 POST)。

    您可能会看到Forbidden,因为“默认情况下,Play 将需要 CSRF 检查”See here?

    像这样将 CSRF 令牌添加到请求中:

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

    或者在表单的正文中:

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

    【讨论】:

    • 我对这个主题(过滤器等)进行了广泛的阅读,以更好地了解导致问题的原因。我在文档中注意到,有一个选项可以禁用特定路由的 CSRF 检查。这是通过将`+ nocsrf` 放在一个路由文件中的post 路由上方来完成的(对于每个post 方法,都需要绕过CSRF 过滤器。我将应用您建议的方法来包含和使用CRSF 过滤器,因为它有点模糊。谢谢!
    • @KGCybeX 确实有效 - 但它是一种解决方法,它消除了 CSRF 提供的安全性。如果您曾经部署过,请务必将 CSRF 令牌放入其中以检查您是否正在执行敏感的 POST。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多