我正在尝试将 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 请求中安全地设置环境(但我可能错了!)。
大概,那么,我可以在中间件中设置一个环境变量。它闻起来很麻烦,所以我想知道是否有其他人(类似地)解决了这个问题。