如何在sqlalchemy查询中使用函数验证密码?

Dam*_*mir 1 python sqlalchemy python-2.7

如何在sqlalchemy查询中使用函数验证密码?在

class PersonModel(Base):
    __tablename__ = 'persons'
    username = Column(String(30), nullable=False)
    email = Column(String(75), nullable=False)
    password = Column(String(128), nullable=False)
Run Code Online (Sandbox Code Playgroud)

我使用存储的密码sha256_crypt.encrypt("password_string")http://pythonhosted.org/passlib /我可以验证sha256_crypt.verify(password_to_check_against, hash)

(试过像

person = session.query(PersonModel).filter(and_(PersonModel.username.like(username), PersonModel.password.like(sha256_crypt.encrypt(password_string)))).first()
Run Code Online (Sandbox Code Playgroud)

但它不起作用=> sha256_crypt.encrypt(password_string)生成不同于db的相同密码的值,我不能==只使用sha256_crypt.verify来自网站的运算符)如何在我的查询中注入这个?

Rei*_*ica 5

您需要使用sha256_crypt.verify(),而不能在AND子句中执行它,因为它需要密码哈希字符串进行验证.

如果您查看此函数的输出示例以及"模块化加密格式"文档:

$ $ 5轮= 80000 $ zvpXD3gCkrt7tw.1 $ QqeTSolNHEfgryc5oMgiq1o8qCEAcmye3FoMSuvgToC

所以它实际上需要前三个部分,加上纯文本密码以相同的方式散列它.

为此,请首先获取用户的信息:

person = session.query(PersonModel).filter(PersonModel.username.like(username)).first()
Run Code Online (Sandbox Code Playgroud)

然后进行验证:

is_authenticated = sha256_crypt.verify(password_string, person.password)
Run Code Online (Sandbox Code Playgroud)