目的:
PBKDF2的 crypt 加密后的密码:
$p5k2$2537$onn0HWXp$TJBLhym0V2H/CNqDN04j8d8M28i3igH3
过程:
1、表模型
#导包
from pbkdf2 import crypt
class Userinfo(Base):
__tablename__ = 'Userinfo'
OprID = Column(TINYINT(3), primary_key=True, autoincrement=True)
UserName = Column(String(45))
_password = Column('Password', String(64))
# def __repr__(self):
# return "<Userinfo(name='%s')>" % self.UserName
# 定义一个内部使用加密的方法
def _hash_password(self, password):
return crypt(password, iterations=0x2537)
# 使用property装饰器使方法变为属性
@property
def password(self):
return self._password
# 设置加密后给类属性赋值
@password.setter
def password(self, password):
self._password = self._hash_password(password)
# 定义一个密码校验的方法
def auth_password(self, pwd):
if self._password is not None:
return self.password == crypt(pwd, self.password)
else:
return False
2、修改密码
修改密码过程逻辑:
①、先校验提交的用户名和密码,通过执行②,否则返回错误信息
②、生成用户表的实例,因为在表模型中自定义生成密码加密方法,使用:实例.password = 前端密码参数 即可生成加密密码
③、通过SQL alchemy更新表字段方法替换原有的密码值
class ForgetHandle(BaseHandler):
def get(self):
pass
async def post(self):
username = self.get_argument("username", "")
password = self.get_argument("password", "")
password1 = self.get_argument("password1", "")
try:
if not username and not password and not password1:
self.write({'code': 1001, 'msg': 'Error', 'data': "用户名或密码错误!"})
# 先查询数据库是否已经存在该用户
with session_maker() as session:
search_name = session.query(Userinfo).filter_by(UserName=username).first()
if search_name and search_name.auth_password(password):
#先创建Userinfo实例
oper = Userinfo()
# 通过实例把需要修改的密码加密
oper.password = password1
#更新修改后的密码
res = session.query(Userinfo).filter_by(UserName=username).update(
{'_password': oper.password})
if res == 1:
self.write({'code': 0, 'msg': 'Success', 'data': "修改成功"})
else:
self.write({'code': 1001, 'msg': 'Error', 'data': "用户名或密码错误!"})
except Exception as e:
logging.error("修改密码错误", e)