金字塔身份验证:为什么它可以工作?

时间:2014-08-16 16:57:18

标签: python authentication login pyramid

我刚刚在我的应用程序中进行身份验证,而且我能找到的所有金字塔示例都能很好地解释这些简单的部分,但是对那些对我没有任何意义的部分进行手动操作。

大多数示例都是这样的:

login = request.params['login']
password = request.params['password']
if USERS.get(login) == password:
    headers = remember(request, login)
    return HTTPFound(location = came_from,
                     headers = headers)

从init:

session_factory = UnencryptedCookieSessionFactoryConfig(
    settings['session.secret']
    )

authn_policy = SessionAuthenticationPolicy()
authz_policy = ACLAuthorizationPolicy()

试图追踪登录实际发生的点,我假设它就是这个:

headers = remember(request, login)

在我看来,正在发生的事情是我们将用户名存储在会话cookie中。

如果我把这一行放在我的应用程序中,当前用户会神奇地登录,但为什么?

  • 金字塔如何知道我正在传递用户名?看起来我只是传递了登录的价值。此外,在不同的示例中,此变量的名称不同。
  • 即使它确实知道它是用户名,它如何将其与用户ID连接?如果我之后运行authenticated_userid(request),它可以工作,但是系统如何将用户名与用户ID相关联?作为remember()文档的一部分,我没有看到任何疑问。

1 个答案:

答案 0 :(得分:5)

金字塔的安全系统围绕principals;您的login值是该主体。您的代码可以为remember()提供有效的主体名称;如果你在表单中填写的登录名被用作你的校长,那就太好了。如果您使用的是电子邮件地址,但使用数据库主键作为主要字符串,那么您必须自己映射。

remember() 做什么取决于您的authentication policy;政策是根据请求“知道”来请求您要求它记住的校长。

如果您使用AuthTktAuthenticationPolicy policy,则主要值存储在加密签名的cookie中;您的下一个响应将添加Set-Cookie标头。然后下一次请求进入该cookie时,如果它仍然有效且签名签出,则策略现在“知道”该请求的原理是什么。

当该请求尝试访问受保护资源时,Pyramid会看到策略生效,并询问该策略是否符合当前的身份验证原则。