Playframework 游戏形式不';t从数据模型中传输省略的字段

Playframework 游戏形式不';t从数据模型中传输省略的字段,playframework,playframework-2.3,Playframework,Playframework 2.3,我是2.3新手,在表单和数据绑定方面遇到了很多麻烦。这是一个让我头疼的场景: 我有一个类似f.e.的模型(省略注释): 现在,我在scala.view中有了一个表单,我希望能够在其中更改用户名: @(userForm: Form[User]) @helper.form(action = routes.UserController.save()) { @helper.inputText(userForm("name"), '_label -> "Name") } 我在控制器中这样调

我是2.3新手,在表单和数据绑定方面遇到了很多麻烦。这是一个让我头疼的场景:

我有一个类似f.e.的模型(省略注释):

现在,我在scala.view中有了一个表单,我希望能够在其中更改用户名:

@(userForm: Form[User])
@helper.form(action = routes.UserController.save()) {
    @helper.inputText(userForm("name"), '_label -> "Name")
}
我在控制器中这样调用此视图:

Form<User> userForm = Form.form(User.class).fill(myUser);
return ok(views.html.usermgmt.useredit.render(userForm));
然而,现在我有一个大惊喜:来自
userForm.get()
的结果用户除了“name”之外没有填充任何字段。没有“id”,没有“任何其他字段”。当生成的对象对进一步处理完全无用时,进行数据绑定有什么意义?我错过什么了吗

如果我没有遗漏什么,那么我必须编写大量样板代码,以便自己进行数据绑定:

  • 手动将更改的字段分配给真正的“用户”对象(我必须首先在
    save()中重新获取该对象)
  • 或者包括模型中所有字段的隐藏字段。在这种情况下,如果我向模型添加另一个字段,最好不要忘记更新表单

请告诉我我错过了什么

手动绑定参数(至少从安全角度来看)是最好的方法。假设您的用户模型有一个保存安全相关信息的字段。例如,在一个非常简单的模型中,
isAdmin
。如果您要从后端用于将信息存储在数据库中的用户类绑定表单,则攻击者可以通过向保存请求添加额外参数,轻松将自己设置为管理员

绑定机制不适用于后端数据模型。这似乎是一个误解,文档中没有明确描述。由于该安全漏洞,我曾经提出过一个bug,但开发人员明确表示,使用后端模型绑定表单数据不是应该使用表单绑定的方式。有关详细信息,请参阅此错误报告:

您只是将name字段添加到表单中,因此当浏览器发送数据(仅用户名)时,只会解析该字段。绑定的思想是将从浏览器获取的数据绑定到对象。也许能帮你避免一些陈词滥调
Form<User> userForm = Form.form(User.class).fill(myUser);
return ok(views.html.usermgmt.useredit.render(userForm));
public static Result save() {
    Form userForm = Form.form(User.class).bindFromRequest();
    User user = userForm.get()
}