Cake PHP ユーザー編集画面でのパスワード編集について
CakePHP 1.2.3.8166、
CakePHP 2.6.0
CakePHPではパスワードを自動的に暗号化してくれるのはよいのですが、ユーザー情報を編集する際にも自動で暗号化してくれるので、それだと2重に暗号化されて、パスワードが違ってしまいます。
いろんなやり方が紹介されてますが、一番スマートなのはこれかなぁ。
CakePHP 1.2.3.8166版
- ユーザー情報編集画面では、”password”という項目ではなく、”new_password”などの別の項目名を使う
- new_passwordが空でなければ、暗号化してpasswordに入れる
参考URL http://osdir.com/ml/CakePHP/2009-05/msg01819.html
以下の例は、上記URLからの抜粋
if (!empty($this->data) { if (!empty($this->data['Model']['new_password'])) { $this->data['Model']['password'] = $this->Auth->password($this- >data['Model']['new_password']; } if ($this->Model->save($this->data) { // data saved } else { // there was an error in the form submission } }
CakePHP 2.6.0版
変わったのは、チュートリアルにあるように、ユーザーモデルでパスワードをSaveする時は、下記のやり方でパスワードをハッシュ化します。
//User.php内 public function beforeSave($options = array()) { if (isset($this->data[$this->alias]['password'])) { $passwordHasher = new SimplePasswordHasher(); $this->data[$this->alias]['password'] = $passwordHasher->hash($this->data[$this->alias]['password']); } return true; }
コントローラーでは下記の通り。
//UsersController.php内 public function edit($id = null) { $this->User->id = $id; if (!$this->User->exists($id)) { throw new NotFoundException(__('Invalid customer')); } if ($this->request->is('post') || $this->request->is('put')) { //パスワードがある場合のみパスワードをDBでUpdate if (!empty($this->request->data['User']['new_password'])) { $this->request->data['User']['password'] = $this->request->data['User']['new_password']; } if ($this->User->save($this->request->data)) { $this->Session->setFlash(EDIT_FINISH,'default',array('class' => 'set_message')); return $this->redirect(array('action' => 'index')); } else { $this->Session->setFlash(EROOR); } } else { $this->request->data = $this->User->read(null, $id); unset($this->request->data['User']['password']); } }
ちなみに、これがベストな方法かはわかりません。
誰かもっとスマートな方法をしっていたら教えてください。