我刚刚在我的应用程序中进行身份验证,而且我能找到的所有金字塔示例都能很好地解释这些简单的部分,但是对那些对我没有任何意义的部分进行手动操作。
大多数示例都是这样的:
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中。
如果我把这一行放在我的应用程序中,当前用户会神奇地登录,但为什么?
答案 0 :(得分:5)
金字塔的安全系统围绕principals;您的login
值是该主体。您的代码可以为remember()
提供有效的主体名称;如果你在表单中填写的登录名被用作你的校长,那就太好了。如果您使用的是电子邮件地址,但使用数据库主键作为主要字符串,那么您必须自己映射。
remember()
做什么取决于您的authentication policy;政策是根据请求“知道”来请求您要求它记住的校长。
如果您使用AuthTktAuthenticationPolicy
policy,则主要值存储在加密签名的cookie中;您的下一个响应将添加Set-Cookie
标头。然后下一次请求进入该cookie时,如果它仍然有效且签名签出,则策略现在“知道”该请求的原理是什么。
当该请求尝试访问受保护资源时,Pyramid会看到策略生效,并询问该策略是否符合当前的身份验证原则。