2014-10-17 2 views
2

У нас есть система аутентификации, которая использует Google App Engine в качестве бэкэнд. Основные языки и фреймворки состоят из Java, JDO, Google Authentication & Google App Engine.Как предотвратить повторяющиеся значения в Google App Engine/В конечном счете, постоянное хранилище данных при аутентификации

У нас есть Пользовательская организация. Пользовательский объект - это метаданные пользователя, сохраненные из ответа на аутентификацию в приложении Google App Engine (например: имя, фамилия, адрес электронной почты).

Когда пользователь пытается зарегистрироваться или войти в систему (как событие входа), мы сканируем хранилище данных, чтобы узнать, существует ли пользователь с тем же адресом электронной почты. Если пользователь еще не существует, мы создаем нового пользователя. Если пользователь существует, мы обновляем и извлекаем их информацию о пользователе, а затем извлекаем данные своих приложений.

Нам нужно выполнить отдельные транзакции, так как страница входа полностью отделена от страницы приложения.

В некоторых случаях, когда пользователь пытается зарегистрироваться дважды за короткий промежуток времени, создается дублирующийся пользователь. Хотя мы всегда могли получить последнего зарегистрированного пользователя, мы действительно хотим, чтобы запрос был уникальным JDO-запросом. Используя уникальный запрос JDO, запрос JDO (выполняется внутри транзакции) иногда терпит неудачу из-за обнаружения двух одинаковых значений (для адреса электронной почты пользователя).

Мы рассмотрели следующие способы для обеспечения соблюдения ограничений:

  1. хранящих информацию свежа зарегистрированного пользователя в кэше. Кажется, мы не обнаружили никакой информации, которая предполагала бы, что кеш будет подходящим решением для предотвращения дублирования. Является ли кеш мгновенно доступным для всех машин? Даже если это так, кеш может вывести объект по разным причинам.
  2. хранение электронной почты пользователя в сеансе. Это, казалось, раздувало код и казалось странным способом обеспечения ограничений.

Существует ли передовой подход с Google App Engine для предотвращения дублирования значений во время процесса проверки подлинности и отдельных транзакций?

ответ

4

Я рекомендовал бы сочетание этих двух подходов:

  1. Создать Войти объект, который состоит из электронной почты пользователя и идентификатор главного пользователя объекта. Сделать электронный адрес пользователя в элементе входа. Это обеспечивает его уникальность.

Дополнительный бонус заключается в том, что вы можете связать несколько адресов электронной почты с одним и тем же объектом пользователя. (У нас есть этот параметр как функция в нашем приложении).

Еще один дополнительный бонус: вы можете заменить свой логин на вызов get(), поскольку вы можете создать ключ с адреса электронной почты. Это дешевле, быстрее и позволяет избежать возможных проблем согласованности (вызовы всегда согласованы).

  1. Сохраните адрес электронной почты (или даже простой флаг «Вход») в сеансах. Это всего лишь 3-5 строк кода, чтобы добавить его и проверить его при каждой попытке входа в систему, поэтому я бы не назвал это «раздуванием».

В моих приложениях я добавляю флаг в сеансы и проверяю этот флаг при каждом вызове экземпляров App Engine (не только входные вызовы, но и все вызовы для дополнительной безопасности), а затем аннулирует сеанс при регистрации пользователей вне.

+0

Привет, Андрей, Для ясности в отношении 1 вы предлагаете использовать keyfactory.createkey только с адресом электронной почты в качестве значения ключа? –

+0

Да. Затем вы вызываете 'get', и вы либо получаете существующую запись, либо EntityNotFoundException. –

Смежные вопросы