学习flask-8-用户认证

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

登录表单: