0

ユーザーがパスワードを忘れた場合、私は現在CakePHPを使用しています。パスワードをリセットできるようにしたいと考えています。(つまり、新しい一時パスワードをメールで送信します)。

しかし問題がある。データベースに保存されているパスワードは Auth コンポーネントによってハッシュされます。つまり、ユーザー モデルからすべてを選択しようとすると、パスワードのハッシュ バージョンが取得されます。さらに、新しいパスワードを生成した後、ハッシュされたパスワードを保存する方法がわかりません。

これに対する答えを見つけるためにしばらくの間グーグルで検索してきましたが、これがどのように行われるかの例を見つけることができなかったようです.

誰かが似たようなことを試したことがありますか、または私ができる方法を知っていますか?

4

3 に答える 3

1

わかりました、2.x は間違いなくより多くの制御を提供します。あなたと同じように、 User モデルの beforeSave メソッドでパスワードをハッシュするだけです。

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

これにより、Controller のパスワード リセット アクションでパスワードをプレーン テキストとして作成し、それをユーザーにメールで送信してから、User モデルでパスワードを設定して保持することができます (パスワードはデータベースにヒットする前にハッシュされます)。ここで重要なことは、コントローラーが save メソッドを呼び出すまで、パスワードがプレーン テキストのままであることです。

通常、コントローラー アクションのパスワード フィールドに unset を常に追加します。これにより、User レコードが再ハッシュされないように保存されます。2 番目のオプションは、ユーザー モデルが読み込まれるたびに設定解除を行うユーザー モデルに afterFind コールバックを追加することです。

ワンタイム リセット キーについて.... User オブジェクトに追加のフィールドがあり、2 つのケースで使用します。メールの確認とパスワードのリセット。ユーザーが作成されると、SHA1( + + ) に設定されます。ユーザーコントローラーの検証アクションに送信するリンクがユーザーに電子メールで送信されます。そのキーが検証されると、その列はデータベースでクリアされます。

パスワード再設定も同様です。ユーザーがリセットを要求すると、同じ方法で値が生成され、ユーザー コントローラーのリセット アクションへのリンクがユーザーに電子メールで送信されます。ユーザー ID を入力し、リンクのキーがデータベース行のキーと一致する場合、パスワードを変更できます。パスワードが変更されると、この値は再びクリアされます。

一時パスワードを送信する際の最大の問題は、DoS メカニズムが作成されることです (サイトではなくユーザーに対して)。誰かに嫌がらせをすることにした場合、1 時間ごとにパスワードをリセットし続けるタスクを作成できます。彼らはメールをチェックするまで入ることができませんが、その後また変わります。キーを使用すると、リセット リンクが記載されたメールが届きますが、リセット コードが存在してもログインできなくなることはないため、現在のパスワードは引き続き機能します。

于 2013-10-14T15:42:39.620 に答える
0

暗号化パスワードを復号化に変換できないと思います。したがって、パスワードをリセットする方法を知りたい場合は、cakephp の CakeDC プラグインを読んでください。

https://github.com/CakeDC/users

これはcakephpの標準プラグインです。

于 2013-10-14T15:08:48.550 に答える