2015-09-11 23 views
1

我有一个用金字塔/ cornice编写的RESTful API。它为Ember客户端提供了一个API。使用檐口的简单身份验证和ACL

我跟着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的经验。

回答

1

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

不久:

  • 您在验证实现哪些功能已经由金字塔与AuthenticationPolicy
  • 开始照顾设定了一个SessionAuthenticationPolicy您自定义回调(see code
  • 一旦这authn设置,您将有那些401响应,并且您的session值在request.authenticated_userid属性中。您还可以在request.registry对象中自定义内容。

的唯一理由,让您的验证是,如果你想在401响应返回invalid token消息。但对于这一点,你可以当你有,你可以设置你的看法自定义授权定义自定义401金字塔视图(使用@forbidden_view_config

。你可以在Cliquet的第一个版本中找到一个非常简单的例子:authz codeview perm

祝你好运!

+0

所以你的建议是避免使用檐口验证器进行身份验证? –

+0

我正在努力。看起来我需要推出我自己的AuthenticationPolicy,SessionAuthenticationPolicy似乎不适合于在每个请求上进行授权时。 –

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) 

而且ofcourse在配置将收到其他参数,像settigns,locale_negociator,...........

希望这将帮助