8.1 Flask 的认证扩展
本章介绍的认证方案使用了多个包,并编写了胶水代码让其良好协作。本章使用的包列表如下。
• Flask-Login:管理已登录用户的用户会话。
• Werkzeug:计算密码散列值hash并进行核对。
• itsdangerous:生成并核对加密安全令牌。
除了认证相关的包之外,本章还用到如下常规用途的扩展。
• Flask-Mail:发送与认证相关的电子邮件。
• Flask-Bootstrap:HTML 模板。
• Flask-WTF:Web 表单。
8.2 密码安全
不能存储密码本身,存储密码的hash值.用Werkzeug
generate_password_hash(password, method= pbkdf2:sha1 , salt_length=8)
check_password_hash(hash, password)
在user模型中加入hash app/models.py
from werkzeug.security import generate_password_hash, check_password_hash
class User(db.Model):
# ...
password_hash = db.Column(db.String(128))
@property
def password(self):
raise AttributeError('password is not a readable attribute')
@password.setter
def password(self, password):
self.password_hash = generate_password_hash(password)
def verify_password(self, password):
return check_password_hash(self.password_hash, password)
测试:
python manage.py shell
tests/test_user_model.py: 密码散列化测试
8.3 认证蓝本(路由)
没有需要特别注意的代码就不放进来了,直接看代码文件即可。
app/auth/init.py
app/auth/views.py
模板文件放在app/templates/auth/login.html
app/init.py的create_app()加上auth蓝本,在链接上加前缀。
8.4 认证用户Flask-Login
Flask-Login 管理认证状态,验证是否登录。
pip install flask-login
修改用户模型: /app/models.py
在User模型中加入四个方法,或者直接使用现成的UserMixin
在app/init.py初始化
在/app/models.py加入回调函数,验证是否注册过
保护路由,该路由需要登录才可访问:
在路由前加修饰器:@login_required
登录表单: