GAE: объективировать удаление по идентификатору

#java #google-app-engine #google-cloud-datastore #objectify

#java #google-app-engine #google-облачное хранилище данных #объективировать

Вопрос:

Я пытаюсь удалить запись из хранилища данных GAE с помощью ajax-запроса, который отправляет объекту «первичный ключ» (длинный идентификатор с автоматическим увеличением).

В настоящее время я делаю это (жестко запрограммированный ключ = 6):

 Objectify ofy = ObjectifyService.begin();
ofy.delete( Test1.class , 6);
  

Это работает: он удаляет объект, у которого есть ключ = 6.
Но по соображениям безопасности мне нужен другой параметр (к вашему сведению: «parent_user»), чтобы только владелец мог удалить этот объект.
Кажется, Objectify.delete() не позволяет передавать больше параметров, чем ключ…

Как я мог это решить? Потому что создание Objectify.get() с моими необязательными параметрами key для получения полного объекта, а затем отправка всего объекта в delete() является неоптимизированным…

Ответ №1:

Как представлено на http://objectify-appengine.googlecode.com/svn/trunk/javadoc/index.html, Objectify.delete() не принимает никаких дополнительных параметров, кроме ключей объекта, идентификаторов или строк.

Итак, вам нужно сначала получить объект на основе ваших фильтров, а затем удалить их. Однако, чтобы оптимизировать это, вы можете получить только ключ объекта, а не полный объект. Затем вы удаляете на основе ключа.

Надеюсь, это поможет!

Ответ №2:

Если ваша модель данных позволяет вам разрешить пользователю быть предком хранилища данных ваших объектов, вы можете избавиться от запроса, поскольку предок является частью ключа.

Что я часто делаю, так это аутентификацию пользователя в начале каждого запроса, который использует аннотацию @Cached Objectify для кэширования всех пользователей (и их привилегий, которые встроены в пользователя).

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