4

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

对于普通 HTML,我AuthTktAuthenticationPolicy用于身份验证和ACLAuthorizationPolicy授权。因此,用户会看到一个登录表单,并在成功登录时auth_tkt设置 cookie。该系统工作正常。

现在我想为 JSON API 复制一个类似的系统。问题是对于 API 请求,用户不一定会登录。所以每个请求都需要一个api_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_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 密钥。

我仍然想看看是否有其他方法可以做到这一点,或者我目前的方案是否有问题

4

1 回答 1

2

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

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

于 2013-07-03T15:18:39.237 回答