我正在使用允许用户编辑个人资料信息的页面。我希望他们能够编辑他们的公共信息,但不允许他们更改系统标志,例如他们的用户类型。
这是使用Spring MVC(3.0)实现的。 User对象具有典型字段,例如firstName
,lastName
,email
(所有都应该是可编辑的)和布尔administrator
(不应该是可编辑的。
我的方法看起来像这样:
@RequestMapping(method = RequestMethod.POST)
public String doEdit(
@ModelAttribute("user") User user,
BindingResult result,
ModelMap model)
throws IOException
{
// validate, blah blah
// save user object
// return page
}
我的表单包含字段firstName
,lastName
等,似乎工作正常。
问题是,如果恶意用户将参数administrator
的查询发布为“true”,他们可以在不应该设置此字段时设置该字段。
我知道我可以创建一个单独的“表单”对象,只包含我想要更改的字段,并将其用于自动绑定。 (复制数据)。问题是我有很多地方使用这种技术。 (对于用户和其他对象)。当我想添加字段时,维护是一件麻烦事。
有没有办法在Spring MVC中使用注释或其他技术将参数列入白名单并防止更改任意域对象属性?
答案 0 :(得分:10)
DataBinder有两个名为allowedFields
和disallowedFields
的属性,用于定义(dis)允许绑定的内容。只需在@InitBinder
方法中使用它:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setDisallowedFields("administrator");
}
答案 1 :(得分:3)
您可以使用“!myParam”样式表达式过滤请求,以指示指定的参数不应出现在请求中。
@RequestMapping(params="!administrator")
答案 2 :(得分:-2)
请勿将此管理员参数发送到客户端,并在服务器端控制它。