SQL Alchemy覆盖==

时间:2012-08-31 09:33:01

标签: python sqlalchemy

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

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

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

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

  4. 我已阅读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)
    

1 个答案:

答案 0 :(得分: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)