CakePHP ユーザーのパスワード編集

PHP

Cake PHP ユーザー編集画面でのパスワード編集について

CakePHP 1.2.3.8166、
CakePHP 2.6.0

CakePHPではパスワードを自動的に暗号化してくれるのはよいのですが、ユーザー情報を編集する際にも自動で暗号化してくれるので、それだと2重に暗号化されて、パスワードが違ってしまいます。

いろんなやり方が紹介されてますが、一番スマートなのはこれかなぁ。

CakePHP 1.2.3.8166版

  1. ユーザー情報編集画面では、”password”という項目ではなく、”new_password”などの別の項目名を使う
  2. 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']);
 		}
 		
 	}

ちなみに、これがベストな方法かはわかりません。
誰かもっとスマートな方法をしっていたら教えてください。

カテゴリーPHP

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です