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/