Spring MVC + JPA - связывание / обновление связанных объектов - PullRequest
0 голосов
/ 02 сентября 2011

Часть этого вопроса связана с JPA, но это больше касается подходов, чем технологий, так что, надеюсь, кто-то сможет дать совет.

Я использую Spring MVC и Hibernate для создания веб-сайта, который позволяет пользователям создавать продукты и описания продуктов. У меня есть объект Product, имеющий двунаправленное отношение «один ко многим» с ProductDescription.

Если при отправке формы, которая привязывается к экземпляру Product и указывает все его ProductDescription, злоумышленник может ввести поддельные идентификаторы для ProductDescription и «похитить» данные других пользователей. Одним из решений этой проблемы было бы всегда создавать 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 ]

2 голосов
/ 29 сентября 2011

Если вы склонны повышать безопасность своего приложения, я бы посоветовал использовать Spring Security и с этим вы можете проверить в сервлете, является ли пользователь владельцем этого продукта, прежде чем обновлять его значения.

Вот какмы сделали здесь до сих пор.тратя немного ресурсов на эту проверку на стороне сервера, но используя почту, только опытные пользователи могут попробовать это, изменив заголовок ответа, так что я не думаю, что это происходит много.

Без безопасности вы можете попробоватьиспользовать сеанс для проверки пользователя, но проблема в том, что если сеанс пропал, никто не может изменить продукт.

Приветствия

2 голосов
/ 29 сентября 2011

Рассматривали ли вы использование объектов передачи данных (DTO)?Таким образом, вы можете передавать DTO, а не объекты-сущности, на промежуточный уровень, и там вы сможете выполнить несколько проверок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...