0

Pythonの初心者であるため、一貫性のない結果が得られる理由がよくわかりません。ユーザーを登録すると、テーブルのパスワードがハッシュバージョンになります。ユーザーが自分のパスワードを更新すると、テーブル内のパスワードはハッシュ化されていないバージョンになります。明らかに、私はハッシュバージョンが欲しいです。私は何が間違っているのですか?(それが重要な場合は、SQLAlchemyとmysqlを使用しています。)

私は次のものを持っています:

def hash_password(password):
    blah, blah, blah # hash my password here
    return hashed_password

class User(Base):
    __tablename__ = 'mytable'
    email = Column('email')
    _password = Column('password')

    def _get_password(self):
        return self._password

    def _set_password(self, password):
        self._password = hash_password(password)
    password = property(_get_password, _set_password)
    password = synonym('_password', descriptor=password)

    def __init__(self, password="", email=""):
        self.email = email
        self.password = password
    @classmethod
    def register(cls, email, password):
        return DBSession.add(User(email=email,password=password)) # this correctly hashes the password

    @classmethod
    def update(cls, email, password):
        return DBSession.query(cls).filter(cls.email == email).update({'password': password}) #password ends up being the unhashed password
4

2 に答える 2

5

ここでの問題は、メソッドを介してパスワードを更新するUser.update方法です。このメソッドは、ORMを完全にスキップし、データベース内の行を直接更新します。これを行うと、パスワードをハッシュするコードが実行されないことは明らかです。貼り付けたUserモデルは問題なく、私が使用しているものと似ています。ただし、それを使用する必要があります。つまり、パスワードを更新するには、ユーザーをロードして、パスワードを設定する必要があります。

user = DBSession.query(User).filter_by(email=email).first()
if user:
    user.password = new_password

そして後でトランザクションがコミットされると、物事はあなたが期待する方法になります。

于 2012-10-21T15:31:34.377 に答える
1

パスワードハッシュをデータベースに保存する必要があるため、モデルのフィールドには生のパスワードではなくハッシュ値が含まれている必要があります。パスワードを設定するには、ハッシュを作成してインスタンスにハッシュを設定するメソッドを使用する必要があります。パスワードが正しいかどうかを確認するには、ユーザー定義のパスワードをハッシュし、結果をインスタンスに保存されているハッシュと比較する必要があります。Yoはハッシュからパスワードをデコードできなくなります-それは安全ではありません。

class User(Base):
    __tablename__ = 'user'

    email = Column('email', String(80))
    password = Column('password', String(80))

    def set_password(raw_password):
        self.password = hash(raw_password)

    def check_password(raw_password):
        return self.password == hash(raw_password)
于 2012-10-20T18:01:39.450 に答える