3

編集 2014 年 8 月 1 日

この編集時間の時点で、サブジェクト プロパティdb.UserProperty()が少なくとも ndb データストアから削除されていることに気付きました。良い!


そう... 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() を使用してユーザー インスタンスを保存し、後でユーザーが戻ってきたときに db.Model インスタンスを取得できるためです。その特定のユーザー。

私の意見では、これはアプリケーションのユーザー検証に脆弱性をもたらします。

@RocketDonkey からの回答は、私のクエリのルーツを説明し、ユーザー認証を保存するために db.UserProperty() User オブジェクト インスタンスを保存しない理由について適切な説明を提供します。

正しい方法は、User インスタンスのuser_id()プロパティを保存することです。これは、すべてのユーザーに対して一意で固定されているためです。

PS私の英語でごめんなさい。誰か編集していただけると助かります。

4

1 に答える 1

4

編集:ユーザーオブジェクト のドキュメントで示されているように:

アプリケーションがユーザー値を格納できるように、db ライブラリと NDB ライブラリの両方に UserProperty プロパティ タイプがあります。ただし、これらの値はユーザーがメール アドレスを変更すると無効になるため、ほとんどのアプリケーションではこの機能をうまく利用できません。

Userインスタンスは常に一意であり、比較できますが、データストアでは一意user_id(常に一意) およびユーザーの電子メール アドレスとして表されるため、ユーザーが電子メール アドレスを変更すると、比較が役に立たなくなります (これは、ドキュメントを保存しない別の理由として)。元の質問 (の使用db.UserProperty) に戻ると、これは、ほとんどの状況で、 User インスタンスをデータストアに格納する正当な理由がないことを示しているようです (理由が見つかった場合は、これを更新します)。

于 2012-12-22T01:08:37.760 に答える