| 22件目(121件中) |

Authコンポーネント使用時のユーザー登録の検証

固定リンク:#0000000102   投稿者:ZiSTA 日時:2010-02-17 17:25:19   コメント( 0

ユーザー登録時のパスワードの入力確認をモデル側で行う方法です。
注意するポイントは通常'password'フィールドがバリデーションを行う前に既にハッシュ化されているという点です。2回入力されたパスワードが同一かどうかチェックするには両方がハッシュ化された状態のデータでチェックするしかありません。


通常はユーザー登録フォームに'password'フィールドと'password_confirm'フィールドを用意してパスワードの入力確認を行おうとします。モデルのバリデーションでこのパスワードの入力確認を行おうとすると次の問題が発生します。

  • 'password'フィールドのデータがハッシュ化されているのでパスワードの最低文字数チェック等が出来ない。
  • 'password_confirm'フィールドをハッシュ化する必要がある。
  • 'password_confirm'フィールドで検証する事もできるが、検証エラーの場合にメッセージをこの位置に出力するのは適切でない。


対策:
ユーザー登録フォームを以下のように'password_confirm','password'の順にする。


add.ctp

echo $form->input('username');
echo $form->input('password_confirm',array('type'=>'password','label'=>'Password'));
echo $form->input('password',array('label'=>'Password Confirm'));


'password_confirm'は当然ハッシュ化されてません。いろいろ検証ルールを設定する事ができます。今回は文字種別と長さを正規表現で、同一性チェックをオリジナルの'doublecheck'メソッドで実装します。'doublecheck'メソッドでは入力されたパスワードをAuthコンポーネントを見習ってSecurity::hashメソッドを使ってハッシュ化しています。


user.php

class User extends AppModel {
    var $name = 'User';
    
    var $validate = array(
            'username' =>array(
                'between'=>array(
                    'rule' => '/^[A-Za-z0-9]{4,12}$/u',
                    'required'=>true,
                    'message' => '英数で4〜12文字以内で入力ください。')
                ,
                'uniq'=>array(
                    'rule' =>array( 'isUnique'),
                    'message' => '登録されています'),)
                ,
            'password_confirm' =>array(
                'between'=>array(
                    'rule' => '/^[A-Za-z0-9]{6,10}$/u',
                    'required'=>true,
                    'message' => '英数で6〜10文字以内で入力ください。'),
                'doublecheck'=>array(
                    'rule'=>'doublecheck',
                    'message' => 'パスワードが一致しませんでした。'))
                ,
            'password' =>array(
                'rule'=>'notEmpty',
                )
                ,
            );
            
            
    function doublecheck($data,$p){
            //passwordはAuthComponentがハッシュ化
            //password_confirmをハッシュ化してチェック。ハッシュ化はAuthComponentと同じコードを使用する事。
            if($this->data['User']['password']==Security::hash($data['password_confirm'], null, true)){
                return true;
            }else{
                return false;
            }
    }
            
}


'username'フィールドに'isUnique'というルールを設定すると同じ名前のユーザーが登録されているかチェックできます。
'password'フィールドに'rule'=>'notEmpty'を設定しておくとラベルがボールドで表示され必須項目である事を示す事が出来ます。

 

コメント

| 22件目(121件中) |
↑ ページトップ