存储用户对象时避免使用db.UserProperty()

时间:2012-12-22 01:00:21

标签: python google-app-engine

修改08/01/2014

截至此编辑时,我意识到至少从ndb数据存储中删除了主题属性db.UserProperty()。好!


所以......有一个存储电子邮件地址的db.UserProperty()模型类 按Unicode顺序。为什么以及如何与仅存储

的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()for Models以保存用户实例,稍后当用户回来时他们可以获得db。该特定用户的模型实例。

在我看来,这会打开应用程序用户验证中的漏洞。

@RocketDonkey的答案解释了我的查询的根源,并给出了为什么不存储db.UserProperty()用户对象实例来存储用户身份验证的一个很好的解释。

正确的方法是存储User实例的 user_id()属性,因为它对每个用户都是唯一且固定的。

P.S。对不起我的英语不好。如果有人可以编辑,将不胜感激。

1 个答案:

答案 0 :(得分:4)

修改:如documentation on User objects所示:

  

db和NDB库都具有UserProperty属性类型   应用程序可以存储用户值。但是,因为这些值变成了   用户更改电子邮件地址时无效,大多数应用程序没有   很好地利用了这个功能。

User个实例始终是唯一的并且可以进行比较,但由于它们在数据存储区中表示为唯一user_id(始终是唯一的)和用户的电子邮件地址,因此用户更改了电子邮件地址将使比较变得无用(这在文档中也表示为不存储它的另一个原因)。回到原始问题(使用db.UserProperty),这似乎表明在大多数情况下,没有正当理由将用户实例存储在数据存储区中(如果我遇到过这个问题,我会更新它原因)。