注意:如果有任何帮助,我正在使用Pyramid 1.3.2。我知道它有点过时,我不想立即更新,但如果最新版本为这个用例提供更好的支持,我可以强制更新。
我正在处理的基于金字塔的应用程序具有严格的授权策略:所有调用必须进行身份验证。因为1)在每个请求handelr上手动添加它是很繁琐的; 2)我们不希望任何人“忘记”添加身份验证,我们使用简单的金字塔中间件(补间)来强制执行此服务器范围,以验证所有传入请求。
最近,这种限制略有放松:偶尔,有些资源应支持(安全和幂等)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
),它不允许我访问可调用的视图,这意味着我无法访问中间件设置的标志。
答案 0 :(得分:0)
你可能想要pyramid.config.set_default_permission(permission)
。来自docs:
添加默认权限使得无需保护每个视图 具有显式权限的配置,除非您的应用程序 政策要求特定视图有一些例外。
如果默认权限有效,请查看配置 创建一个真正匿名访问的视图(甚至异常视图视图) 必须使用可导入权限的值作为
pyramid.security.NO_PERMISSION_REQUIRED
。当这个字符串用作 视图配置的permission
,默认权限为 忽略,视图已注册,使所有人都可以使用 呼叫者,无论他们的凭据如何。
raydeo _ 在#pyramid freenode IRC频道上提供的答案。