5

ユーザー編集ビューがあります。ユーザーがこのビューにアクセスすると、パスワード ブロックにハッシュ化されたパスワードが含まれます。

保存をクリックすると、(明らかに) パスワードが再度ハッシュされます。これは、これが User モデルにあるためです。

public function beforeSave($options = array()) {
    if(!empty($this->data['User']['password'])) {
        $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
    }
    return true;
}

しかし、2回ハッシュしたくありません(パスワードが変更されたことを意味するため)。編集ビューを変更array('value' => '','autocomplete'=>'off')し、パスワード フィールドに追加しました。保存すると、空白の文字列がデータベースに保存されます。関数内のif(!empty($this->data['User']['password']))ステートメントでそれを防ぐと思いました。beforeSave

パスワードが二重にハッシュされないようにするにはどうすればよいですか?

4

5 に答える 5

5

解決策はかなり簡単です。beforeSave の if ステートメントを次のように変更するだけです。

public function beforeSave($options = array()) {
    if(!empty($this->data['User']['password'])) {
        $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
    }
    return true;
}

に:

public function beforeSave($options = array()) {
    if(!empty($this->data['User']['password'])) {
        $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
    } else {
        unset($this->data['User']['password']);
    }
    return true;
}
于 2013-02-01T09:37:43.723 に答える
3

ハッシュを比較します。

データベースに保存されたハッシュをパスワード フィールドのテキストと比較できます。パスワードに触れていない場合 (パスワード フィールドを変更した場合)、ハッシュは一致するはずです。保存したハッシュがxyzで、パスワード ハッシュに読み込まれたハッシュがまだ変更されていないとしxyzます。この場合、何も再ハッシュする必要はなく、ハッシュは同じままである必要があります。

他のケースでは、保存されたハッシュがxyzであるとしましょうが、パスワード html フィールドをabc;に編集しました。この場合、新しいパスワード ( abc) を再ハッシュしてから、データベース レコードにある古いパスワードを置き換える必要があります。

これらはすべて、次のようにコードに変換できます。

public function beforeSave($options = array()) {

    if (isset($this->data[$this->alias]['password'])) {

        if(isset($this->data[$this->alias]['id'])) {
            $id = $this->data[$this->alias]['id'];
            $user = $this->findById($id);
        } else {
            $id = false;
        }

        if(!$id || $this->data[$this->alias]['password'] != $user['User']['password']) {
            $passwordHasher = new SimplePasswordHasher();
            $this->data[$this->alias]['password'] = $passwordHasher->hash(
                $this->data[$this->alias]['password']
            );
        }

    }

    return true;
}

よろしく、M

于 2014-05-22T05:44:28.543 に答える
0
public function beforeSave($options = array()) {
    if(AuthComponent::user('id') == null)
        if (isset($this->data[$this->alias]['password'])) {
            $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
        }
        return true;
}
于 2013-11-11T07:04:37.927 に答える
0

通常、ユーザー編集ページは、説明したものとは異なります。ハッシュ化されたパスワードを保存すると、編集ビューでパスワードが返されることはありません。

ユーザーがパスワードを変更したい場合、フォームには通常 3 つのフィールドが含まれます

  • 以前のパスワード
  • 新しいパスワード
  • 新しいパスワード (前のパスワードと同じかどうかを確認するため)

次に何が起こるか:

  • 2 つの新しいパスワードの値が等しいかどうかを確認する
  • 古いパスワードをハッシュする
  • 新しいパスワードをハッシュする
  • 古いパスワード ハッシュがデータベース内のハッシュと等しいかどうかを確認します...そうであれば、古いハッシュは新しいハッシュに置き換えられます

あなたの例では、ハッシュと通常のパスワードを区別できないため、ハッシュも単なる文字列リテラルであるため、コードはおそらく現在の状態では機能しません。

于 2013-02-01T08:26:29.683 に答える