我有一个简单的表单,可以在网络上编辑我的个人资料。 '人'描述用户的bean包含许多不能由表单更改的内部字段。因此,我只有一小部分可在表单上编辑的字段。到现在为止还挺好。现在,如果某个高级用户在Chrome浏览器中打开开发人员工具并在表单上添加其他字段或重命名某些现有字段...那么当提交时,这些字段将被绑定回“人员”。 bean并存储到数据库中。这样,用户可以轻松地欺骗我的表单并为不允许的字段设置值。有没有办法如何定义(服务器端)在表单提交期间可以绑定哪些字段(bean属性)?
以下是控制器方法签名的概念:
@RequestMapping(path = "/profile/edit", method = RequestMethod.POST)
public String editProfile(@ModelAttribute("profile") Person doc, BindingResult result, Model m){
... saving doc to database ...
}
我在Thymeleaf中使用SpringBoot 1.3.5 ......
答案 0 :(得分:0)
原来这个解决方案非常简单。我刚刚向控制器添加了@InitBinder
带注释的方法,并使用WebDataBinder
提供的对象来指定允许的字段列表。为此,我可以使用binder.setAllowedFields(...)
方法。字段名称支持“xxx *”,“* xxx”和“ xxx ”模式,因此在bean中正确命名时,可以轻松指定字段集。现在,当post请求变量绑定到我的bean时,这些允许的字段将被保留,其他字段将被拒绝而不受约束。
代码示例:
@InitBinder // or @InitBinder("profile") with ModelAttribute name information
public void initBinder(WebDataBinder binder) {
binder.setAllowedFields("settings*");
}
有关详细信息,请参阅DataBinder docs。