time 2017/10/17
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;
}
これで、ハッシュ化される前の状態でバリデーションを行うことができるます。