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

Jer*_*y T 0 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)
Run Code Online (Sandbox Code Playgroud)

从init:

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

authn_policy = SessionAuthenticationPolicy()
authz_policy = ACLAuthorizationPolicy()
Run Code Online (Sandbox Code Playgroud)

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

headers = remember(request, login)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mar*_*ers 5

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

究竟remember() 确实取决于你的认证策略 ; 政策是根据请求"知道"来请求您要求它记住的校长.

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

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