Password validatation in CakePHP1.2
Password validatation?
- そうです、UserテーブルにID/PASSを登録する際に、そのPASSをバリデーションしたい!
既存問題点
- 通常はID/PASS登録フォームはAuthComponentと一緒に利用するのは普通です。
- だけど、AuthComponentのstartupではModelとControllerに渡す$this->dataの前に自動ハッシュ変換を行われます。
$this->data = $controller->data = $this->hashPasswords($controller->data);
- そうすると、普通にModel側にバリデーション書いても、ハッシュ後の値に対するバリデーションなので、意味はありません!しかも、空白で送信しても、ハッシュ変換後はハッシュ文字列になりますので、必須チェックも動作しません。
解決方法
- ModelでhashPasswordsをオーバーライトしましょう!
- Controller側オーバーライトするModelを指定!
function beforeFilter() { parent::beforeFilter(); if($this->action == "add") $this->Auth->authenticate = $this->User; $this->Auth->allow('add'); }
-
- Model側新しいhashPasswordsを定義
/** * Authコンポネントの自動パスワードハッシュをオーバーライト * バリデーション段階では自動ハッシュを阻止する * ※これを動作するためにはController側に下記を追加するのを前提とします * ※$this->Auth->authenticate = $this->User; * * @param unknown_type $data * @param unknown_type $enforce * @return unknown */ function hashPasswords($data, $enforce=false) { if($enforce && isset($this->data[$this->alias]['password'])) { if(!empty($this->data[$this->alias]['password'])) { $this->data[$this->alias]['password'] = Security::hash($this->data[$this->alias]['password'], null, true); } } return $data; } /** * データをSaveする前に自動ハッシュを動作させます。 * * @return unknown */ function beforeSave() { $this->hashPasswords(null, true); return true; }
参考:http://teknoid.wordpress.com/2008/10/08/demystifying-auth-features-in-cakephp-12/