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)

但是,由于GAE Utilities 的会话存储了 RPX 的用户标识符,因此没有全局User

对我来说最明显的解决方案是在中间件中创建一些全局用户变量(以某种方式本地化到当前请求/线程)。但是,除非我确信没有比赛条件,否则我不会这样做。

构造 CurrentUserProperty 时,有什么方法可以将当前用户的身份(存储在请求会话变量中)获取到 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 回答