偶尔禁用金字塔中间件

时间:2013-06-10 18:04:58

标签: pyramid

注意:如果有任何帮助,我正在使用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),它不允许我访问可调用的视图,这意味着我无法访问中间件设置的标志。

1 个答案:

答案 0 :(得分:0)

你可能想要pyramid.config.set_default_permission(permission)。来自docs

  

添加默认权限使得无需保护每个视图   具有显式权限的配置,除非您的应用程序   政策要求特定视图有一些例外。

     

如果默认权限有效,请查看配置   创建一个真正匿名访问的视图(甚至异常视图视图)   必须使用可导入权限的值作为   pyramid.security.NO_PERMISSION_REQUIRED。当这个字符串用作   视图配置的permission,默认权限为   忽略,视图已注册,使所有人都可以使用   呼叫者,无论他们的凭据如何。

raydeo _ 在#pyramid freenode IRC频道上提供的答案。