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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章