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を解決する方法を理解していると思います。

しかし、2番目のポイントをどのように行うかはわかりません。(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

比較するには、パスワードをハッシュ解除できないため、eq 演算子をオーバーライドする Column クラスのカスタム タイプを作成する必要があります。

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 に答える