2011-09-02 52 views
0

這個問題有些與JPA有關,但更多的是關於方法而不是技術,所以希望有人能夠提供建議。Spring MVC + JPA - 綁定/更新關聯實體

我正在使用Spring MVC和Hibernate來爲一個允許用戶創建產品和產品說明的網站提供支持。我有一個Product實體,它與ProductDescription具有雙向一對多關係。

如果在提交綁定到Product的實例並指定其所有ProductDescription的表單時,惡意用戶可能會輸入ProductDescriptions的僞造ID並「劫持」其他用戶的數據。解決這個問題的方法之一是始終創建ProductDescription,然後在提交表單時刪除它們,並且每次都創建新的表單。這似乎效率低下,因爲每次更新產品時都會需要額外的刪除和寫入操作(即使ProductDesciptions未更改)。

另一種選擇是在運行更新之前檢查子實體的「所有權」。

其他人如何解決此問題?大多數人是否會刪除/插入或選擇性更新?

這裏是我說的那種POST提交的例子:

id=1 
name=My Product 
descriptions[0].id=123 
descriptions[0].text=A lovely description of my product 
descriptions[0].price=100 
descriptions[1].id=123 
descriptions[1].text=Another lovely description of my product in another language 
descriptions[1].price=50 

而且我說的那種類的一個例子:

public class Product 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 
    @OneToMany(mappedBy = "product") 
    private Set<ProductDescription> descriptions; 
    private String name; 
} 


public class ProductDescription 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 
    private Integer price; 
    @ManyToOne 
    private Product product; 
    private String text; 
} 

回答

2

如果您傾向於將安全性添加到您的應用程序中,我會建議使用spring安全性,並且在更新其值之前,如果用戶是該產品的所有者,您可以檢查servlet。

這就是我們迄今爲止所做的。通過在服務器端進行檢查浪費了一點資源,但只有高級用戶可以通過更改響應頭來嘗試,因此我不認爲這會發生很多。

如果沒有安全性,您可以嘗試使用會話來驗證用戶,但問題是如果會話不存在,則無法更改產品。

乾杯

+0

我想這就是我們要做的。我們支持PHP表示層,因此不能直接訪問會話,否則我們可以將其綁定並使用會話羣集。 –

2

你有沒有考慮使用數據傳輸對象(DTO)?這樣你可以將DTOs而不是實體對象傳遞給中間層,並且在那裏你可以執行多次檢查。