Избегайте использования db.UserProperty() при хранении пользовательских объектов
Изменить 08/01/2014
На момент редактирования я понял, что свойство объекта db.UserProperty()
удаляется из хранилища данных ndb как минимум. Хорошо!
Итак... Существует класс модели db.UserProperty(), который хранит адрес электронной почты в порядке Юникода. Почему и как это отличается от строки Unicode, которая просто хранит
users.get_current_user().email()
в db.StringProperty() скажем?
Безопасно ли использовать его как:
class LocalUser(db.Model):
user_account = db.UserProperty()
my_local_user = LocalUser.all().filter("user_account=", users.get_current_user().get())
РЕДАКТИРОВАТЬ
Причина, по которой я задал этот вопрос, заключается в том, что многие примеры и некоторые книги для Google App Engine используют db.UserProperty() для Моделей, чтобы сохранить экземпляр пользователя, а затем, когда пользователь возвращается, они могут получить экземпляр db.Model для этот конкретный пользователь.
На мой взгляд, это открывает уязвимости в проверке пользователей вашего приложения.
Ответ от @RocketDonkey объясняет корни моего запроса и дает хорошее объяснение, почему бы не хранить экземпляры пользовательских объектов db.UserProperty() для хранения аутентификации пользователей.
Правильный способ - сохранить свойство user_id() экземпляра User, поскольку оно уникально и исправлено для каждого пользователя.
PS Извините за мой английский. Если кто-то может редактировать, это будет оценено.
1 ответ
Изменить: как указано в документации на объекты пользователя:
Библиотеки db и NDB имеют типы свойств UserProperty, чтобы приложения могли хранить пользовательские значения. Тем не менее, поскольку эти значения становятся недействительными, когда пользователи меняют адрес электронной почты, большинство приложений не могут эффективно использовать эту функцию.
User
экземпляры всегда уникальны и их можно сравнивать, но поскольку они представлены в хранилище данных как уникальные user_id
(который всегда будет уникальным) и адрес электронной почты пользователя, пользователь, изменяющий свой адрес электронной почты, сделает сравнение бесполезным (это также указано в документации как еще одна причина не сохранять его). Возвращаясь к исходному вопросу (использование db.UserProperty
), это, по-видимому, указывает на то, что в большинстве случаев нет веской причины для хранения пользовательских экземпляров в хранилище данных (я обновлю это, если мне встретится причина).