Authコンポーネントでパスワード変更フォーム作ったら
保存した時に暗号化されなかったり、暗号化された
パスワードが入力欄に入ったりしたので備忘録。
■現象
【1つ目】
Authコンポーネント使用後、パスワード変更フォームで
パスワード入力して保存すると、DB側にはパスワードが
裸のまま保存される(「aaa」と入力したらそのまま保存)。
※ユーザー新規登録画面からユーザー名と
パスワードを入力した場合はちゃんと暗号化(ハッシュ化)
されて保存される。
【2つ目】
パスワード入力欄のvalueが暗号化されたパスワードが
入ってるため、そのまま保存するとハッシュ化後の
パスワードが二重に暗号化して保存されてしまう。
■原因
【1つ目】
パスワード変更時は暗号化されないっぽい。
【2つ目】
DB保存のパスワードが暗号化後の値のため、
当然そのまま引っ張ってきてしまっている。
(ちなみに暗号化を戻す復号化して表示みたいなのはできない)
■対策
【1つ目】
パスワード変更時に$this->Auth->hashPasswords($this->data)で
丸ごと暗号化をかけてDB保存する。
【2つ目】
パスワード入力欄をデフォ空白にしておき、
「新しいパスワード」みたいなフォームにする。
空白だったらパスワード変更なし、
空白以外だったらパスワード変更あり とする。
(但し、そうすると今度はバリデーションに引っかかるが、
ここでは設けない)
■対策後のソース(UsersController) RESOLUTION Source
function edit() {
$id = $this->Auth->User('id');
if (!$id && empty($this->data)) {
$this->Session->setFlash('ユーザーが見つかりません', 'flash_message', array('result' => 'error'));
$this->redirect(array('action' => 'edit'));
}
if ($id && !empty($this->data)) {
// パスワード入力欄が空白だったら配列削除 delete array if empty the password input form
if (empty($this->data['User']['password'])) {
unset($this->data['User']['password']);
}
// userのidとusernameを定義しないと暗号化されない hashing need both username and password
$this->data['User'] += array(
'id' => $this->Auth->User('id'),
'username' => $this->Auth->User('username'),
);
// AuthのhashPasswords関数でパスワードを暗号化してから保存 hashing password
if ($this->User->save($this->Auth->hashPasswords($this->data))) {
$this->Session->setFlash('変更内容を保存しました', 'flash_message', array('result' => 'success'));
//$this->redirect(array('action' => 'edit'));
} else {
$this->Session->setFlash('変更内容を保存できませんでした。もう一度実行してみてください。', 'flash_message', array('result' => 'error'));
}
}
if (empty($this->data)) {
$this->data = $this->User->read(null, $id);
}
}
■参考サイト
5.2.5.4 hashPasswords
CakePHP 1.3 API - hashPasswords
cakePHP | Authコンポーネントのパスワード暗号化に対応する
■for English
I have problem two things that change password page on CakePHP Auth component.
[CAUSE]
1. I couldn't save hashing password.
2. password form show the hashing password.
[RESOLUTION]
1. use hassPassword class.
$this->Auth->hashPasswords($this->data)
2. set blank password form then check the form. check the my source.
A website is a reflection of your personality even though it is ostensibly for your business establishment.