版权声明:风火编程, 欢迎指正. https://blog.csdn.net/weixin_42620314/article/details/82811377
flask后台的用户密码相关逻辑
模型类设置
class User(BaseModel, db.Model):
"""用户表"""
__tablename__ = "ih_user_profile"
id = db.Column(db.Integer, primary_key=True) # 用户id
name = db.Column(db.String(32), unique=True) # 用户昵称,不能重复
password_hash = db.column(db.String(128), nullable=True) # 加密密码
mobile = db.Column(db.String(11), unique=True, nullable=False) # 手机号
real_name = db.Column(db.String(32)) # 真实姓名
id_card = db.Column(db.String(20)) # 身份证号
avater_url = db.Column(db.String(128)) # 用户头像路径
orders = db.relationship("Order", backref="user") # 用户的订单
@property
def password(self):
"""读取密码的property属性"""
raise AttributeError("不支持访问密码")
@password.setter
def password(self, origin_password):
"""设置password_hash"""
@property
def password(self):
"""密码的property属性"""
raise AttributeError("不支持访问密码")
@password.setter
def password(self, origin_password):
"""设置password_hash"""
使用sha256加密方法,默认8位盐值
from werkzeug.security import generate_password_hash
self.password_hash = generate_password_hash(origin_password)
def check_password(self, password):
"""校验密码的方法"""
from werkzeug.security import check_password_hash
return check_password_hash(self.password_hash, password)
视图中的处理
1. 保存密码
user.password = password
2. 检查尝试错误次数封ip
failed_times = redis.get(ip)
if failed_times and failed_times>MAX_TIMES:
return jsonify(errcode=RET.REQERR, errmsg="尝试次数超过上限")
3. 校验密码
user and user.check_password(password)
4. 记录ip的尝试错误次数
ip = request.remote_addr
redis_store.incr(ip) # 记录ip尝试错误次数
redis_store.expire(ip, FORBID_TIME)
5. 记录登录状态
session["user_id"] = user.id
session["mobile"] = mobile
session["user_name"] = user.name