CakePHP1.3 バリデーションしつつAuthのログインPASSを登録する方法

CakePHPには、便利で強力なバリデーションと認証のシステムがあります。
システム構築時にはどちらも使うことになると思うのですが、ユーザーを登録する際には少しコツがいります。

というのは、パスワードに4文字以上15文字以内という文字制限を行う場合、cakePHPはハッシュ化されたパスワードフィールドを元にバリデーションを行うので、期待した結果にはならなくなります。
つまり、『SHA-256』でハッシュ化すると64文字になるので、15文字以内の文字制限にひっかかってしまいます。

これを解決するには、以下のような方法を行います。

結論から言うと、ハッシュ化したいパスワードフィールドと違う名前のフィールドにバリデーションを行っちゃいます。
『password』というフィールドをパスワードに使用しているなら、『pass』を用意しちゃう感じですね。

文章力がないので、例を書いちゃいます。

▼モデル

public $validate = array(
    'username' => array(
        array(
            'rule'    => 'alphaNumeric',
            'message' => '半角英数字で入力してください。',
        ),

        array(
            'rule'    => array('between', 4, 20),
            'message' => '半角英数字、4文字以上20文字以内で入力してください。',
        ),

    // 別名で用意したフィールドにバリデーションを行う
    'pass' => array(
        array(
            'rule'    => 'alphaNumeric',
            'message' => '半角英数字で入力してください。',
        ),

        array(
            'rule'    => array('between', 4, 20),
            'message' => '半角英数字、4文字以上20文字以内で入力してください。',
        ),
);

▼ビュー

echo $form->create('User', array('type' => 'post', 'action' => './add'));
echo $form->inputs(
	array(
		'legend' => 'ユーザー登録',
		'username',
		'pass'
	)
);
echo $form->end('登録');

▼コントローラー

public function add() {
    if(!empty($this->data)) {
        // ここでAuthで使用するパスワードフィールドに値を渡しています
        $this->data['User']['password'] = $this->Auth->password($this->data['User']['pass']);
 
        if ($this->User->save($this->data)) $this->redirect(array('controller' => 'users', 'action' => 'index'));
    }

    $this->data['User']['pass'] = null;
}

これで、ハッシュ化される前の状態でバリデーションを行うことができるます。

コメントは受け付けていません。