Python 金字塔中的混合认证策略

Python 金字塔中的混合认证策略,python,pyramid,Python,Pyramid,我正在编写一个应用程序,该应用程序将包含一些HTML内容(显示表等)和一个JSON API 对于普通HTML,我使用AuthTktAuthenticationPolicy进行身份验证,使用ACLAuthorizationPolicy进行授权。因此,向用户提供一个登录表单,并且在成功登录时设置cookie。系统运行良好 现在我想为JSON API复制一个类似的系统。问题是,对于API请求,用户不一定要登录。因此,每个请求都需要一个api\u key参数。基于该键,如果我找到一个有效的用户,我将返回

我正在编写一个应用程序,该应用程序将包含一些HTML内容(显示表等)和一个JSON API

对于普通HTML,我使用
AuthTktAuthenticationPolicy
进行身份验证,使用
ACLAuthorizationPolicy
进行授权。因此,向用户提供一个登录表单,并且在成功登录时设置cookie。系统运行良好

现在我想为JSON API复制一个类似的系统。问题是,对于API请求,用户不一定要登录。因此,每个请求都需要一个
api\u key
参数。基于该键,如果我找到一个有效的用户,我将返回JSON。另外,我显示403页

一种方法是在每个视图中执行此操作

api_key = request.GET.get('api_key',None)
user = FrontEndUsers.User_by_api_key(api_key)
if user: 
    #Process view
else:
    return HTTPForbidden
然而,对于每个视图来说,它似乎太像一个锅炉板了,无法像身份验证策略那样精确地执行操作。我可以为JSON路由指定单独的身份验证策略吗?或者还有其他的方法吗

编辑

再想一想,似乎即使使用
AuthTktAuthenticationPolicy
,我也必须这样做
security.authenticated\u userid()
在每个视图中(如果我需要身份验证信息)。这一点我已经考虑到一个单独的函数中

def get_auth_info(): 
    user_id = security.authenticated_userid()
    login_info = {}
    if user_id is not None: 
        login_info['login'] = True
        login_info['logged_in_user'] = FrontendUsers.get_user_by_id(user_id).name
    else: 
        login_info['login'] = False
    return login_info
我可以在这个函数中包含API密钥检查函数调用,这样我的视图就不会改变(我仍然只调用
get\u auth\u info()
),但我可以检查是否提供了正确的API密钥


我仍然想知道是否还有其他方法可以做到这一点,或者我当前的方案是否存在问题

您在这里没有提到如何使用权限?在视图上正确使用权限和ACL可以避免在函数开始时运行该样板文件。对于您展示的简单粘贴,您只需要一个
权限class='logged_in'
和一个ACE映射
(允许,经过身份验证的,'logged_in')
,但如果需要,您当然可以变得更复杂


不能简单地为不同的视图指定不同的身份验证策略,因为金字塔中的身份验证策略是全局的。您可以通过pyramid_multiauth全局执行此操作。或者,您可以编写自己的策略,根据请求属性包装多个策略并将其分派给一个或另一个策略。

是的,我有一个根对象,用于定义ACL,对于视图,我使用
permission=something
(根据教程)。我需要运行boiler plate的原因是要用注销链接或登录链接来显示登录的用户名。您能详细说明一下第二点吗?我知道如何编写自己的策略,但如何确保分派部分?我故意让它模棱两可,因为pyramid的auth策略旨在实现全局性。WSGI应用程序都是相对的,如果存在相互冲突的问题,没有理由不能编写两个金字塔应用程序,一个用于api,另一个用于公众。如果您坚持将它们合并到一个策略中,那么您可以检查请求属性以确定要使用的子策略,然后从
unauthenticated\u userid
方法或api的任何其他方法中调用
self.api\u policy.unauthenticated\u userid(request)
。但是考虑到API不需要一个完整的策略(例如,不需要记住和忘记,加上API密钥只能有一个经过身份验证的用户ID),您认为我可以使用我当前的方案运行吗?对HTML请求使用AuthenticationPolicy,但对API使用DB调用?当然可以,与声明性配置相反,视图代码中的锅炉板更多,但这是可以解决的