3

我正在创建代表用户凭据的 SQLAlchemy 类。

我想要password存储密码哈希值的字段。因此,我想通过以下方式覆盖其行为:

  1. 分配credentials.password = value时,它实际上存储值的散列

  2. 比较credentials.password == value时,它实际上是与值的哈希值进行比较

我已阅读 SQLAlchemy 文档http://docs.sqlalchemy.org/en/rel_0_7/orm/mapper_config.html#using-descriptors-and-hybrids的以下部分

而且我想我确实了解如何解决第 1 个问题。

但是我不确定,如何做第二点。有没有办法以安全的方式做到这一点(不破坏 SQLAlchemy)?

这是示例模型:

class Credentials(Base):
    __tablename__ = 'credentials'

    id = Column(Integer, primary_key=True)

    _password = Column('password', String)

    @hybrid_property
    def password(self):
        return self._password

    @password.setter(self):
        self._password = hash(self._password)
4

1 回答 1

2

为了进行比较,由于您无法取消对密码的哈希处理,因此您需要为 Column 类创建一个自定义类型,该类型会覆盖 eq 运算符:

class MyPasswordType(String):
    class comparator_factory(String.Comparator):
        def __eq__(self, other):
            return self.operate(operators.eq, hash(other))

看看:http ://docs.sqlalchemy.org/en/latest/core/types.html#types-operators

http://docs.sqlalchemy.org/en/latest/core/types.html#sqlalchemy.types.TypeEngine.comparator_factory

要进行设置,您只需要传入值:

@password.setter
def password(self, value):
    self._password = hash(value)    
于 2012-09-01T10:58:53.473 回答