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

Python 存储用户对象时避免使用db.UserProperty(),python,google-app-engine,Python,Google App Engine,编辑2014年1月8日 在编辑时,我意识到主题属性db.UserProperty()至少已从ndb数据存储中删除。好! 所以。。。存在存储电子邮件地址的db.UserProperty()模型类 按Unicode顺序。它与仅存储 users.get_current_user().email() 在db.StringProperty()中,让我们说: 按如下方式使用是否安全: class LocalUser(db.Model): user_account = db.UserPrope

编辑2014年1月8日

在编辑时,我意识到主题属性
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\u id()属性,因为它对于每个用户都是唯一和固定的


对我的英语很抱歉。如果有人可以编辑,将不胜感激

编辑:,如下所示:

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


User
实例始终是唯一的,可以进行比较,但由于它们在数据存储中表示为唯一的
User\u id
(始终是唯一的)和用户的电子邮件地址,因此用户更改其电子邮件地址将使比较无效(这也是文档中指出的不存储用户实例的另一个原因)。回到您最初的问题(使用
db.UserProperty
),这似乎表明在大多数情况下,没有有效的理由将用户实例存储在数据存储中(如果遇到原因,我将更新此内容).

因此,用户对象实例是唯一的?我的意思是,您将用户对象存储在.User\u帐户中,然后用户更改其电子邮件地址。这会在我的数据库中返回相同的用户吗?目前我正在保存User.User\u id,这是一个永久id和唯一的。我可以理解用户类的用法,但保存的实例不会验证回到电子邮件更改时,我不明白原因…@JimmyKane事实上我读了更多的书(我承认在我需要该功能的任何时候,我都按照你上面提到的方式做过事情),最后我遇到了。关于实际存储数据(而不是在数据存储之外使用
用户
对象),它说,
但是,由于这些值在用户更改电子邮件地址时无效,因此大多数应用程序对该功能没有什么用处。
我将修改我的答案以反映这一点(并为在发布之前没有进行更多研究表示歉意:)。这些是我读过的内容。我把作业做好后才把问题贴出来。所以我发布这个问题的另一个原因是,关于AppEngine的2/3书籍和好书保存了用户实例,并将其用于验证。还有许多与google app engine官方文档中的用户对象无关的示例也使用用户对象。如果我用你的ex address等创建一个地址,这将成为一个严重的安全漏洞。@JimmyKane是的,我完全同意你的观点-因为用户ID是唯一的,可以比较,将其存储在数据存储中并对其进行查找似乎会提供一种更可靠的查询方式,因为尽管基础电子邮件地址发生变化,
用户id
将保持不变。如果您愿意,我很乐意删除这个答案,因为我们似乎得出了相同的结论,而且可能还有其他人遇到过存储
用户属性
确实有意义的情况。@JimmyKane一点问题都没有-我们都学到了一些东西:)祝一切顺利。“我认为这会打开应用程序用户验证中的漏洞。“-什么漏洞?@NickJohnson您使用您的openid注册到我的应用程序,并将其作为电子邮件发送。nick@tiki.com . 1年后,由于各种原因,您删除了您的电子邮件。一段时间后,另一个人注册了该电子邮件地址。他使用我的应用程序。会发生什么?他被确认为尼克!!!如果他是特权用户呢?在OpenID的情况下,你是通过你的OpenID URL识别的,而不是你的电子邮件地址。就谷歌账户而言,你的身份是由你的用户ID识别的,而不是你的电子邮件地址。在任何一种情况下,它都应该是唯一的,无限期地。@NickJohnson是的,但是userproperty存储什么呢?你的电子邮件。因此,如果您正在存储此属性并对此属性进行验证,那么这是一个问题。如果需要,我也可以将电子邮件存储在许多其他属性类型中。