Spring MVC + JPA - 绑定/更新关联实体

时间:2011-09-02 07:48:37

标签: hibernate binding jpa spring-mvc

这个问题有些与JPA有关,但它更多的是关于方法而不是技术,所以希望有人能够提供建议。

我正在使用Spring MVC和Hibernate为一个允许用户创建产品和产品描述的网站提供支持。我有一个Product实体,它与ProductDescription具有双向的一对多关系。

如果在提交绑定到Product实例的表单并指定其所有ProductDescriptions时,恶意用户可能会输入ProductDescriptions的伪造ID并“劫持”其他用户的数据。对此的一个解决方案是始终重新创建ProductDescriptions,因此在提交表单时删除它们,并且每次都创建新的表单。这似乎效率低下,因为每次更新产品时都需要额外的删除和写入操作(即使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 个答案:

答案 0 :(得分:2)

您是否考虑过使用数据传输对象(DTO)?这样你就可以将DTO而不是实体对象传递给中间层,在那里你可以执行几次检查。

答案 1 :(得分:2)

如果您倾向于为您的应用程序添加安全性,我建议使用spring security,如果用户是该产品的所有者,您可以在更新它的值之前检查servlet。

这就是我们到目前为止所做的工作。在服务器端检查时浪费了一点资源但是使用post,只有高级用户可以通过更改响应头来尝试,所以我不认为它发生了很多。

如果没有安全性,您可以尝试使用会话来验证用户,但问题是如果会话消失,则无人可以更改产品。

干杯