混合金字塔中的身份验证策略

时间:2013-07-03 10:52:23

标签: python pyramid

我正在编写一个具有一些HTML内容(显示表等)的应用程序,并且还有一个JSON API。

对于普通HTML,我使用AuthTktAuthenticationPolicy进行身份验证,使用ACLAuthorizationPolicy进行授权。因此,向用户显示登录表单,并在成功登录auth_tkt时设置cookie。系统工作正常。

现在我想为JSON API复制一个类似的系统。问题是对于API请求,用户不一定会登录。因此每个请求都需要一个api_key参数。根据密钥,如果我找到有效用户,我会发回JSON。 Otherwsie我显示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_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_key检查函数调用,以便我的所有视图都不会更改(我仍然只调用get_auth_info()),但我可以检查是否已显示正确的API密钥。

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

1 个答案:

答案 0 :(得分:2)

你在这里没有提到你如何使用权限?在视图上正确使用权限和ACL可以防止您在函数开始时需要运行该样板。对于您展示的简单粘贴,您只需要permission='logged_in'和ACE映射(Allow, Authenticated, 'logged_in'),但当然,如果需要,您可以变得更复杂。

不可能以简单的方式为不同的视图指定不同的身份验证策略,因为金字塔中的身份验证策略是全局的。您可以通过pyramid_multiauth全局完成。或者,您可以编写自己的策略,根据请求属性将多个策略和调度包装到一个或另一个。