【发布时间】:2013-06-10 18:04:57
【问题描述】:
注意:如果有帮助,我使用的是 Pyramid 1.3.2。我知道它有点过时了,我不希望立即更新,但如果最新版本对此用例提供更好的支持,我可能会强制更新。
我正在开发的基于 Pyramid 的应用程序具有严格的授权策略:所有调用必须经过身份验证。由于 1) 在每个请求处理程序上手动添加它很乏味; 2)我们不希望任何人“忘记”添加身份验证,我们使用一个简单的 Pyramid 中间件(补间)在服务器范围内强制执行此操作,以验证所有传入请求。
最近,这个限制稍微放宽了:偶尔,一些资源应该支持(安全和幂等)GET,无需身份验证。
这似乎与大多数 Web 框架中身份验证背后的通常设计理念(可选身份验证)直接相反,所以我无法让它按预期工作。
问题:实现授权中间件的正确方法是什么?该中间件默认验证和验证授权,但可以在逐个视图的基础上禁用?
到目前为止,我已经尝试像这样添加一个简单的装饰器:
def allows_anonymous_access(f):
f.allows_anonymous_access = True; return f
@allows_anonymous_access
def my_pyramid_view(request):
# ...
在我的中间件中,我想这样使用它:
def authorization_middleware(handler, registry):
def verify_authorization(request):
# Identify the user making the request. Make sure we get the
# user's identify if provided, even when the request handler
# allows anonymous access.
try:
request.principal = extract_user(request)
except InvalidCredentials, error:
if getattr(handler, 'allows_anonymous_access', False):
request.principal = AnonymousUser()
else:
raise HTTPUnauthorized(...)
# Invoke the handler.
return handler(request)
# Middleware that will pre/post-process the request.
return authorization_middleware
但是,当中间件执行时,handler 不是我的看法。它恰好是一个绑定方法 (pyramid.router.Router.handle_request),它不让我访问可调用的视图,这意味着我无法访问中间件设置的标志。
【问题讨论】:
-
Pyramid 有自己的身份验证系统。我强烈建议尝试使用它而不是自己编写。您所要求的在框架内部非常简单,可能比您在这个问题中粘贴的代码少。 Piotr 提供的答案是正确的,但是如果不配置 ACL 和 authn/authz 策略,您将很难使用它。这里还有其他几个关于 SO 讨论如何做到这一点的问题。
标签: pyramid