0

Google App Engine をRPX Nowユーザー認証とユーザーごとに制限されたアクセスパターンと組み合わせようとしています。

ユーザーごとのアクセス制限パターンは、GAE のグローバルな User.get_current_user() に依存しています。

from google.appengine.api import users

class CurrentUserProperty(db.UserProperty):
  def checkCurrentUser(self, value):
    if value != users.get_current_user():
      raise db.BadValueError(
          'Property %s must be the current user' % self.name)
    return value

  def __init__(self, verbose_name=None, name=None):
    super(CurrentUserProperty, self).__init__(
        verbose_name, name, required=True, 
        validator=self.checkCurrentUser)

ただし、 RPX のユーザー識別子を格納するGAE Utilities のセッションでは、グローバルなUserはありません。

私にとって最も明白な解決策は、ミドルウェアでいくつかのグローバル User 変数 (何らかの方法で現在の要求/スレッドにローカライズされたもの) を作成することです。ただし、競合状態がないと確信できる場合を除き、これは行いません。

CurrentUserProperty が構築されているときに、(リクエスト セッション変数に格納されている) 現在のユーザーの ID を CurrentUserProperty に取得する方法はありますか?

読んでくれてありがとう。

編集

GAE の google/appengine/tools/dev_appserver.py:578 を読むと、次のことが行われます。

579 env['USER_ID'] = user_id

および google/appengine/api/users.py:92ff には次のように書かれています。

92  if _user_id is None and 'USER_ID' in os.environ:
93     _user_id = os.environ['USER_ID']

単一の Google App Engine リクエストで環境を安全に設定できることを示唆しているようです (しかし、私は間違っているかもしれません!)。

おそらく、ミドルウェアで環境変数を設定できます。面倒臭いので、他の誰かが(同様に)これに取り組んだかどうか知りたい.

4

1 に答える 1

2

App Engineインスタンス(および実際にはCGI一般)はシングルスレッドであることが保証されているため、リクエストごとに環境変数を設定することは確かに安全です-実際、現在のリクエストに関するすべての情報は現在の環境を介して渡されます!ユーザーがログインしていない場合は、必ず環境変数を_un_setしてください。そうすれば、認証されていないリクエストが同じインスタンスにヒットする前のリクエストの認証を取得することはできません。

于 2009-09-30T09:25:43.683 に答える