播放表单不会从数据模型中传输省略的字段

时间:2014-10-13 05:22:07

标签: playframework playframework-2.3

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

我有一个像这样的模型。 (注释遗漏):

public class User extends Model {
    public Integer id;
    public String name;
    public String anyOtherField;
}

现在我在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));

当用户提交表单时,我会像我那样回到控制器中:

public static Result save() {
    Form userForm = Form.form(User.class).bindFromRequest();
    User user = userForm.get()
}

然而,现在我感到非常惊讶:来自userForm.get()的结果用户没有填写“name”以外的字段。没有“id”,没有“anyOtherField”。当结果对象完全无用于进一步处理时,具有数据绑定有什么意义?我错过了什么吗?

如果我不遗漏某些内容,那么我必须编写大量样板代码才能自己进行数据绑定:

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

请告诉我,我想错了......?

1 个答案:

答案 0 :(得分:0)

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

绑定机制并不意味着与后端数据模型一起使用。这似乎是一个误解,在文档中没有明确描述。由于该安全漏洞,我曾经提交过一次错误,但开发人员明确表示使用后端模型绑定表单数据并不是应该使用表单绑定的方式。有关详细信息,请参阅此错误报告: https://github.com/playframework/playframework/issues/2358