Tornado+PBKDF2+SQLAlchemy(十三)Tornado修改加密密码

目的:

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 "" % 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)

 

 

你可能感兴趣的:(Tornado,pbkdf2加密)