我正在编写一个具有一些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密钥。
我仍然想知道是否有其他方法可以做到这一点,或者我的当前方案是否存在问题
答案 0 :(得分:2)
你在这里没有提到你如何使用权限?在视图上正确使用权限和ACL可以防止您在函数开始时需要运行该样板。对于您展示的简单粘贴,您只需要permission='logged_in'
和ACE映射(Allow, Authenticated, 'logged_in')
,但当然,如果需要,您可以变得更复杂。
不可能以简单的方式为不同的视图指定不同的身份验证策略,因为金字塔中的身份验证策略是全局的。您可以通过pyramid_multiauth全局完成。或者,您可以编写自己的策略,根据请求属性将多个策略和调度包装到一个或另一个。