我正在尝试为User
对象设置编辑表单。我有从表单到用户对象的自动绑定工作正常。
我想知道如何防止恶意用户绑定到我不希望他们访问的User
对象的字段?
例如,我的用户对象有userName
,而且还有points
。当他们点击修改用户时,我希望他们能够更改userName
,而不是points
。恶意用户可以通过编辑HTML在表单中发送额外的points=429429
作为隐藏字段,这将由Spring自动绑定到后备对象。
答案 0 :(得分:4)
我建议将前端代码与将保存在数据库中的逻辑分开。表单支持对象只是一个简单的对象,用于捕获用户在视图中完成的操作...它不应该用于直接保存到数据库。我会让服务层处理是否更新某些字段的决定......控制器应该只接收输入并传递它。这样,服务可以决定应该更新哪些字段。
public void updateUser(long userId, User updatedUser) {
User currentUser = dao.getCurrentUserById(userId);
currentUser.userName = updatedUser.username;
//...... update anyother fields....
dao.SaveUser(currentUser);
}
或者您可以通过调用者知道将要更新的内容来定义方法:
public void updateUser(long userId, String updatedUsername);
我还认为,如果此逻辑位于服务层中,则单元测试要容易得多。
希望这有帮助
答案 1 :(得分:4)
将此添加到您的控制器:
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setAllowedFields("field1", "field2");
}