CakePHP Auth でパスワード変更フォームの暗号化周り(暗号化されずに登録される場合など)

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.

One Reply to “CakePHP Auth でパスワード変更フォームの暗号化周り(暗号化されずに登録される場合など)”

Comments are closed.