使用 cornice 的简单身份验证和 ACL

simple Authentication and ACL using cornice

我有一个RESTfulAPI写在金字塔/cornice。它为 Ember 客户端提供了 API。

我遵循了 cornice tutorial 并且有一个 valid_token 验证器,我在许多视图中使用它作为资源方法 类.

def valid_token(request):
    header = 'Authorization'
    token = request.headers.get(header)
    if token is None:
        request.errors.add('headers', header, "Missing token")
        request.errors.status = 401
        return
    session = DBSession.query(Session).get(token)
    if not session:
        request.errors.add('headers', header, "invalid token")
        request.errors.status = 401
    request.validated['session'] = session

现在我想开始有选择地保护资源。 The Pyramid way 似乎要注册 authentication/authorization 政策。 ACLAuthorizationPolicy 似乎提供了对金字塔中漂亮的 ACL 工具的访问。但是,金字塔似乎需要身份验证和授权策略才能发挥作用。由于我正在使用我的验证器进行身份验证,这让我很困惑。

我可以在使用 cornice valid_token 验证器进行身份验证时使用 ACL 来控制授权吗?我需要注册金字塔身份验证或授权策略吗?

我有点迷茫,在金字塔中使用ACL的经验很少。

这不是一个简单的问题:)

很快:

  • 您在验证器中实现的内容已由 Pyramid 和 AuthenticationPolicy 处理
  • 开始使用您的自定义回调 (see code) 设置 SessionAuthenticationPolicy
  • authn 设置完成后,您将获得那些 401 响应,以及 request.authenticated_userid 属性中的 session 值。您还可以在 request.registry 对象中自定义内容。

保留验证器的唯一原因是如果您想 return invalid token 响应中的 invalid token 消息。但是为此,您可以定义自定义 401 金字塔视图(使用 @forbidden_view_config

完成后,您可以为您的视图设置自定义授权。您可以在此处的 Cliquet 第一个版本中找到一个非常简单的示例:authz code and view perm

祝你好运!

你可能想做这样的事情:

from pyramid.authentication import SessionAuthenticationPolicy
from pyramid.authorization import ACLAuthorizationPolicy
from your_module import valid_token 

authn_policy = SessionAuthenticationPolicy(debug=True, callback=valid_token)
authz_policy = ACLAuthorizationPolicy()

config = Configurator(authentication_policy=authn_policy,authorization_policy=authz_policy)

当然在配置中会收到其他参数,如 settigns,locale_negociator,......

希望这会有所帮助