(八)从登录操作区分账号与密码摘要
1. 用户名查记录,密码交给校验工具
alice 与 bob 需要各自的账号记录。登录时先按用户名找到用户,再把本次输入的密码交给摘要校验工具;数据库保存的是 password_hash。
# 项目文件:demos/password_hashes.py
# 随机盐使相同演示密码生成不同摘要;校验时读取摘要中保存的方法与参数。
from werkzeug.security import check_password_hash, generate_password_hash
first = generate_password_hash("learn-alice")
second = generate_password_hash("learn-alice")
print("摘要不同", first != second)
print("正确密码", check_password_hash(first, "learn-alice"))
print("错误密码", check_password_hash(first, "not-the-password"))Werkzeug 是提供 Web 相关工具的 Python 库,werkzeug.security 中的 generate_password_hash 生成带方法、参数和随机盐的信息,check_password_hash 用保存的结果核对本次密码。两次相同密码产生不同摘要,但两份都可以核对相同的正确输入。
随机盐使同样的密码不直接对应一份固定文本。这里使用库提供的密码摘要计算与校验,不把普通字符串相等比较当作密码保存方案。密码摘要接口
2. 登录后的每次请求仍需找到用户
HTTP 请求之间不会自动保留某个 Python 函数的局部变量。登录成功后,服务器建立一条会话记录,把随机编号交给浏览器;后续请求带回编号,服务器再从会话找到用户。
因此数据库中有三类数据:users 保存账号与密码摘要,sessions 保存会话编号及其关联身份,books 保存某位用户的书籍。下一节先建立这三类记录,再按登录过程逐项连接。