2010-02-09 61 views
4

我正在嘗試爲我的User對象設置編輯窗體。我有從窗體自動綁定到用戶對象工作正常。Spring MVC 3 - 綁定參數到後臺對象

我想知道如何防止惡意用戶綁定到我不希望他們使用的User對象的字段?

例如,我的用戶對象有userName,它也有points。當他們點擊編輯用戶時,我希望他們能夠更改userName,但不能更改points。惡意用戶可以通過編輯HTML來將額外的points=429429作爲表單中的隱藏字段發送,並且Spring會自動將其綁定到後備對象。

+2

請參閱前面的問題,他們做的正是這件事與'id'場使用'@ InitBinder'標註方法:HTTP:/ /stackoverflow.com/questions/2232095/spring-form-handling-mapping-an-entity-to-form-inputs – axtavt 2010-02-09 21:12:15

+0

好評,@initbinder的東西就是我一直在尋找的東西。如果可以的話,我會接受它作爲答案。 – Kyle 2010-02-10 04:07:29

回答

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); 

我也認爲這是比較容易進行單元測試很多,如果這個邏輯是服務層。

希望這有助於

4

添加到您的控制器:

@InitBinder 
protected void initBinder(WebDataBinder binder) { 
binder.setAllowedFields("field1", "field2"); 
}