我有一个用金字塔/ 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的经验。
答案 0 :(得分:1)
这不是一个简单的问题:)
不久:
SessionAuthenticationPolicy
(see code)authn
后,您会在401
属性中获得session
次回复和request.authenticated_userid
值。您还可以在request.registry
对象中自定义内容。保留验证程序的唯一原因是您要在invalid token
响应中返回401
条消息。但为此,您可以定义自定义401金字塔视图(使用@forbidden_view_config
)
完成后,您可以为自己的观看次数设置自定义授权。您可以在此处找到Cliquet第一版中的一个非常简单的示例:authz code和view 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,............
希望这会有所帮助