わかりました、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 時間ごとにパスワードをリセットし続けるタスクを作成できます。彼らはメールをチェックするまで入ることができませんが、その後また変わります。キーを使用すると、リセット リンクが記載されたメールが届きますが、リセット コードが存在してもログインできなくなることはないため、現在のパスワードは引き続き機能します。