CakePHP で Auth コンポーネントを使用した会員登録機能の作成。
ごりごりPHP書きながら調べものしてたら会員登録とユーザ認証にはAuthコンポーネントを使うとよさ気だったので使ってみた。ただしデフォルトでは微妙な感じであったのでいろいろ設定したり。
まず Auth を使う為にコントローラの頭に
var $components = array('Auth');
Auth では Users テーブルにある username と password のカラムをデフォルトでは使用する様になっているのでこれを変更する。記述場所はコントローラ内 beforeFilter。このメソッドはアクションが実行される前に実行される、という事で良いのかな。以下Authの設定はここに入る。
$this->Auth->fields = array(
'username'=>'mail',
'password'=>'password'
);
また、passwordはハッシュ化されて保存されるのだが、なぜかログイン時と会員登録時のハシュ値に違いがあったのでハッシュアルゴリズムを明示的に指定してやった。デフォルトで sha1 って書いてあったんだがな。。。
Security::setHash('sha1');
ついでに ログインせずに表示するページを設定。アクション名をいれてやる。
$this->Auth->allow('add','index','view');
設定はこんなところか。
次にパスワード確認を追加する。パスワード2回入力させて合ってるかどうか見るやつ。
最初コントローラに書こうとしてたが、コントローラでやるとエラー時の処理が validate と別になってしまうので、俺俺 validate を書く事にした。また、パスワードはコントローラに入った時点でハッシュ化されていてパスワード文字列のチェックもできないのでこれにも対応。
確認用フォームは password_confirm とし、コントローラの add() の適当なところに以下を追加。
$this->data['User']['password_confirm_hash']
= $this->Auth->password($this->data['User']['password_confirm']);
モデルの validate を以下のようにする。
var $validate = array(
'password' => array(
'rule1' => array(
'rule' => 'notEmpty',
'message' => 'please input password.',
),
'rule2' => array(
'rule' => array('passwordConfirm'),
'message' => 'please input same word in password and confirm area.',
),
),
'password_confirm' => array(
'rule' => array('between', 4, 50),
'message' => 'please input password between 4 and 50.',
),
);
function passwordConfirm($data) {
if ($this->data['User']['password']
== $this->data['User']['password_confirm_hash']) {
return true;
} else {
return false;
}
}
パスワードが二つとも同じかどうかは、確認用のパスワードもハッシュ化しないと比較できないのでハッシュ化したものを追加。この処理もモデル内に書きたかったが、Auth->password をモデル内で実行する方法がよくわからんかったのでこんな感じになった。
文字列のチェックはハッシュ化されない password_confirm に対してのみ行う。password と password_confirm は同じ文字列だからだ。
こんな感じかな。