【CakePHP】AuthComponentについてのまとめ その2【ちょっとしたコツ編】
【CakePHP】AuthComponentについてのまとめ 【ざっくり基本編】 の続きです。
CakePHPの1.2.0.6311-betaでの話。
暗号化のタイミングとvalidation
※stable版では、Auth->allow()に指定すれば、Model内のvalidationを使えるようになりそうです(2008/3/17更新)
Auth->allow()に含まれるアクションの場合はパスワードがハッシュ化されなくなるようです。これでモデル内のvalidationを適用できますね。
不明。RC版では、方針が元にもどった模様
前回のソースをみるとControllerの処理に暗号化の処理がないことに気付きます。
//ログイン
function login(){
}
//ユーザ追加
function add() {
if (!empty($this->data)) {
$this->User->create();
$this->User->save($this->data['User']);
$this->redirect(array(’action’ => ‘index’));
}
つまり、AuthComponentが暗号化の処理も自動的にやってくれます。
なのですが、ちょっと注意が必要です。
例えば、「パスワードは英数字4文字以上8文字以内」なんていう制限をかけたい場合、
CakePHP の1.2から実装された、Model内の強力なvalidationを使いたいところですが、
modelやcontrollerに制御が戻ってきた時点ですでに暗号化されています。
従って、
class User extends AppModel {
var $name = 'User';
var $validate = array(
'password' => array(
'rule1' => array('rule' => array('between' , 4 , 8)),
'rule2' => array('rule' => array('alphaNumeric'))
)
);
}
という風に書いてもチェックできません(ハッシュ化された後のデータでvalidationされるから)。
「ユーザ登録時に再入力パスワードと一致しているかチェックしたい 」場合も同様です
簡単な方法としては、
modelと違う名前で受けて、controller側でエラー処理を行う方法が考えられます。
ユーザ追加用のview(view/users/add.ctp)
<?php
echo $form->create('User', array('action' => 'add'));
echo $form->input('username');
//UserではなくParamという名前でフォームからデータを受けとる
echo $form->input('Param/password');
echo $form->submit();
echo $form->end();
echo $form->error('Param::password_len','パスワードは4~8文字の範囲で入力して下さい。');
echo $form->error('Param::password','パスワードは半角の英数字で入力して下さい。');
?>
ユーザ追加用のcontroller(controllers/users_controller.ctp)
//ユーザ追加
function add() {
if (!empty($this->data)) {
$this->User->create();
if(!ctype_alnum($this -> data['Param']['password'])){
$this->User->invalidate(’Param::password’);
}else{
if(strlen($data['Param']['password'])<4 || strlen($data['Param']['password'])>8){
$this->User->invalidate(’Param::password_len’);
}
$this->User->data=$data;
$this->User->validates();
if(count($this->User->validationErrors)>0){
//パスワードを暗号化して、model Userに渡す
$data['User']['password']=$this->Auth->password( $data['Param']['password'] );
$this->User->save($this->data['User']);
$this->redirect(array(’action’ => ‘index’));
}
}
}
※上記のように暗号化を自分で行いたい場合は次のように書きます
$hash=$this->Auth->password( $password] );
デフォルトから変更する場合
AuthComponentは、以下のように色々カスタマイズが可能です。
$this->Auth->allowのみ、各controllerに書いて、共通のものをapp_controllerに指定するのが楽かもしれません
app_controllerの例
function beforeFilter()
{
//ログインできるユーザの条件をデータベースのフィールドの値で指定
$this->Auth->userScope = array('User.verified' => 1);
//ログイン処理を行うactionを指定(/users/loginがデフォルト)。
$this->Auth->loginAction = '/users/userlogin';
//ログインが失敗した際のエラーメッセージ
$this->Auth->loginError = 'ログインエラーです';
//権限が無いactionを実行した際のエラーメッセージ
$this->Auth->authError = '権限がありません';
//ログイン後にリダイレクトするURL
$this->Auth->loginRedirect = '/users/myhome';
//ユーザIDとパスワードがあるmodelを指定('User'がデフォルト)
$this->Auth->userModel = 'Name';
//ユーザIDとパスワードのフィールドを指定(username、password がデフォルト)
$this->Auth->fields = array('username' => 'email', 'password' => 'pwd');
}
各controllerの例
function beforeFilter()
{
parent::beforeFilter();
//ログインを必要としない処理 指定しないと全てのactionでログインが必要となるので注意
$this->Auth->allow('view','add');
}
ログインに失敗した際のメッセージは、どうやって処理するの?
AuthComponentのエラーメッセージ処理ですが、エラーが起きるとsetFlashを使って、メッセージをセッションにkey’auth’に書き込んでくれます。
従ってログインフォームに、次のように書くとエラーメッセージが取り出せます
< ?php if ( $session->check('Message.auth') )
{
$session->flash('auth');
}
?>
ログインしているかどうか、チェック仕方は?
次のように書くと取得できます
$this->Auth->isAuthorized()
現在ログインしているユーザ名やIDの取り出し方
$user=$this->Auth->user();
とすると、ユーザ情報が保管されているmodelが取得できます。後は何なりと好きにして状態。もちろん、フィールド単位でも可能です
$userid=$this->Auth->user('id');
まとめ
※おかしなところがありましたら、ご指摘頂けると幸いです。
【CakePHP】AuthComponentについてのまとめ 【ざっくり基本編】
【CakePHP】AuthComponentについてのまとめ その2【ちょっとしたコツ編】
【CakePHP】OpenIDをAuthComponentにトッピングしてみる
とあわせて読んでいただけると、理解が深まります。
参考にさせて頂いたサイト
http://www.webdevelopment2.com/cakephp-auth-component-tutorial-1/
http://www.littlehart.net/atthekeyboard/2008/01/08/simple-user-registration-in-cakephp/
http://wiki.kabturek.info/authcomponent
http://www.cpa-lab.com/tech/AuthComponent%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9
Popularity: 45 %
by 赤がすき 










[CakePHP]AuthComponentのパスワード暗号…
1.2系で追加されたAuthComponentは、認証関連の処理を一手に担ってくれる強力なコンポーネントですが、 AuthComponentのパスワード暗号化。登録注 (more…)
Cakeの1.1系から1.2系に移行しようと苦戦中のものですが、このような記事はもう、ホントありがたくて仕方ありません。
私のような難民はみんなあなた様に救われていることでしょう。
難民を救うことなどモチベーションにつながらないかもしれませんが、これからもこのような記事を書いていただけると、難民の一人としてとてもうれしく思います。
花粉や黄砂の舞う季節で、なにかとアルコールの摂取量も増えそうな今日この頃ですが、どうぞお体を大切に頑張ってください。
それでは。
モチベーション上がりまくりです。
コメントありがとうございました。
私も立派な難民・・・です。
今も、paginationをmodelに押し込みたいのですが、うまくいかなくて悩んでます。
わかったことは、みなさんとシェアしたいと思いますので、これからもよろしくお願いします。
本当に勝手に暗号化されるの??
どうやって?コンポーネントの配列にAuthが入ってるだけで?
処理の流れが分からない。
こんにちは、kofunさん
コメントありがとうござました。
Authcomponentも他のコンポーネントと同じで、用意されているフックを利用しています。
Authcomponentのstartupを覗くと、暗号化している部分が見えますよね。
beforeFilterでコンポーネントの設定→Authcomponentのstartupを実行(ここで暗号化など一連の作業)→controller(
ユーザ登録などのアクションの順番)で実行されます。
コンポーネントのフックについてはこちらが参考になると思います。
http://cakephp.jp/doc/ch09s02.html
startup以外のフックについてはhaltさんのエントリーが参考になります
http://project-p.jp/halt/anubis/blog_show/1008
なるほど参考になりました.やっぱりCakeは難しいですね.
[...] 【CakePHP】AuthComponentについてのまとめ その2【ちょっとしたコツ編】 http://blog.ne2ma2.com/archives/161 [...]