使用檐口进行简单的身份验证和ACL

时间:2015-09-11 11:34:59

标签: python authentication authorization pyramid cornice

我有一个用金字塔/ cornice编写的RESTful API。它为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似乎是注册身份验证/授权策略。 ACLAuthorizationPolicy似乎可以访问金字塔中的精美ACL工具。但是,金字塔似乎需要身份验证和授权策略才能运行。由于我使用验证器进行身份验证,这让我很困惑。

我可以使用ACL来控制授权,同时使用我的檐口valid_token验证器进行身份验证吗?我是否需要注册金字塔身份验证或授权政策?

我有点困惑,没有在金字塔中使用ACL的经验。

2 个答案:

答案 0 :(得分:1)

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

不久:

  • 您在验证器中实施的内容已由Pyramid通过AuthenticationPolicy
  • 处理
  • 开始使用您的自定义回调设置SessionAuthenticationPolicysee code
  • 设置authn后,您会在401属性中获得session次回复和request.authenticated_userid值。您还可以在request.registry对象中自定义内容。

保留验证程序的唯一原因是您要在invalid token响应中返回401条消息。但为此,您可以定义自定义401金字塔视图(使用@forbidden_view_config

完成后,您可以为自己的观看次数设置自定义授权。您可以在此处找到Cliquet第一版中的一个非常简单的示例:authz codeview perm

祝你好运!

答案 1 :(得分:0)

你可能想做类似的事情:

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,............

希望这会有所帮助