0

我的 Google App Engine 模型中有一个用户实体,一个用户有姓名、电子邮件、密码和其他一些东西。目前,我使用用户的电子邮件作为实体的密钥。到目前为止,我还没有考虑过如果用户更改他的电子邮件会发生什么。

使用 email 作为 key 如此方便的原因是客户端设备总是知道用户的 email,而不是存储和跟踪一些单独的 user_id,只通过电子邮件查找会更方便。

那么如果用户确实更改了他们的电子邮件怎么办?毕竟这是一件大事吗?要做的工作是微不足道的吗?对于用户来说,有哪些更好的密钥选择?

4

4 回答 4

2

使用 App Engine 上的联合身份选项,我采用了一种将 primary_federated_identity 作为每个用户的键的方法。这样,用户可以更改电子邮件、处理任何其他内容,但仍然是同一个人。

像@Tim Hoffman 以及primary_federated_identity 我使用一个子实体,但在我的情况下它是一个UserIdentity 集合。

class User(db.Model):
    primary_federated_identity = db.StringProperty(required = True)
    handle = db.StringProperty(required = True)
    created = db.DateTimeProperty(required = True, auto_now_add = True)
    ...

class UserIdentity(db.Model):
    user = db.ReferenceProperty(User, collection_name = 'user_identities')
    user_federated_identity = db.StringProperty(required = True)
    user_federated_provider = db.StringProperty(required = True)
    ...

当我写一个新用户时:

from google.appengine.api import users
from models.models import User
...
def some_function():
    key_name = users.federated_identity()
    my_site_user = User(key_name = key_name, primary_federated_identity=key_name, handle=handle)

当我检索到一个时:

key_name = user.federated_identity()
return User.get_by_key_name(key_name)
于 2012-11-20T16:40:55.090 回答
1

使用 int/Integer,GAE 将为您分配一个键值。

于 2012-08-27T12:34:19.250 回答
0

如果 email == 键,那么当用户想要更改他的电子邮件时,您将需要创建一个新的用户实体。
由于这个原因,通常电子邮件不是一个好的密钥,您可以拥有一个系统,将所有旧参考替换为新参考,但这取决于您的系统有多复杂。

于 2012-08-27T12:36:24.147 回答
0

在我设计的一个项目中,我们将登录名和哈希密码以及其他属性(启用标志、密码更改标志等)保存为用户的单独子实体。这个实体的关键是登录。这意味着可以随时更改密钥(登录名),我们可以删除/替换子实体而不必重新设置密钥等......这确实意味着需要祖先查询来获取用户,但是然后在第一次检索后缓存(memcache 等)。

这种方法将所有登录细节都保留在用户之外,(我们实际上通过更改子身份验证实体的实现来支持 google 登录以及 authtkt userid/passwd 样式的登录。)

于 2012-08-28T00:19:35.013 回答