【CakePHP】AuthComponentについてのまとめ その3【ログイン後のリダイレクト編】
2chの疑問に全力で答える
昨日、
【CakePHP】AuthComponentについてのまとめ その2【ちょっとしたコツ編】を書いた後
2chのCakePHPのスレッドを見てみると、こんなやり取りがありました
827 名前:nobodyさん[sage] 投稿日:2008/03/05(水) 15:20:16 ID:???
>>820
AuthComponentは使えない。オレオレ的な使い方がしにくい
認証後の飛び先を認証直前の画面に設定できない
だからAuth系はできるだけ単純な方がいい
AuthComponentは柔軟な拡張には向かない840 名前:nobodyさん[sage] 投稿日:2008/03/05(水) 18:58:46 ID:???
>>827認証後の飛び先だけ自分でコントロールすればいいだけじゃねの?
認証後の飛び先を認証直前の画面に設定ぐらい楽勝
その程度でオレオレ的っていうのか、しらんが
841 名前:nobodyさん[sage] 投稿日:2008/03/05(水) 19:30:33 ID:???
>>840
楽勝ならコード書いてみせて
口だけならなんとでも言える845 名前:nobodyさん[sage] 投稿日:2008/03/05(水) 20:53:16 ID:???
>>841
認証にこけて認証ページにリダイレクトする前にurlをセッションに入れて
認証完了後にそのurlに飛ばせばいいだけじゃね846 名前:nobodyさん[sage] 投稿日:2008/03/05(水) 21:02:22 ID:???
リダイレクト先指定出来た筈だけど
845さん、846さんの言うとおりだと思う。
が、結局、コード゙は出てこなかったので、代わりに全力で答えてみる。
2パターンあります(多分こういう趣旨だと思いますが違っていたら、ごめんなさい)
2パターンの簡単な説明
1.AuthComponentにリダイレクトを任せる
2.リダイレクトを自分で行う
2パターンの共通
app_controllerのbeforeFilterでログイン・ログアウト後に戻るアドレスをセッションにセット
function beforeFilter(){
//ログイン、ログアウト後に戻らせたくないactionをリスト(必要ならcontrollerも指定)
if( $this -> action != 'login'
&& $this -> action != 'logout'
&& $this -> action != 'add')
{
$this->Session->write('login_back_url',Dispatcher::uri(););
}
}
パターン1.AuthComponentにリダイレクトを任せる
app_controllerのbeforeFilterでAuthComponentのリダイレクト先をセットします
2パターンの共通のapp_controllerのbeforeFilterに以下を追加します
function beforeFilter(){//2パターンの共通のapp_controllerのbeforeFilterに追加 if ($this->Session->check('login_back_url')){ $login_back_url=$this->Session->read('login_back_url'); }else{ $login_back_url='/'; } //auth コンポ-ネントの定義 $this->Auth->loginRedirect = $login_back_url; $this->Auth->logoutRedirect = $login_back_url; }
パターン2.リダイレクトを自分で行う
ログイン・ログアウト後に普通にリダイレクト
2パターンの共通のapp_controllerのbeforeFilterに以下を追加します
function beforeFilter(){//2パターンの共通のapp_controllerのbeforeFilterに追加 $this->Auth->autoRedirect=false; }
ログインaction
function login(){
if($this->Session->check('login_back_url')){
$login_back_url = $this->Session->read('login_back_url');
$this->Session->delete('login_back_url');
}else{
$login_back_url = '/';
}
$this->Session->setFlash('こっそりログインした');
$this->redirect($login_back_url);
}
ログアウトaction
function logout(){
if($this->Session->check('login_back_url')){
$login_back_url = $this->Session->read('login_back_url');
$this->Session->delete('login_back_url');
}else{
$login_back_url = '/';
}
$this->Session->setFlash('全力でログアウトした');
$this->Auth->logout();
$this->redirect($login_back_url);
}
【CakePHP】AuthComponentについてのまとめ 【ざっくり基本編】
【CakePHP】AuthComponentについてのまとめ その2【ちょっとしたコツ編】
とあわせて読んでいただけると、理解が深まります。
2chのCakePHPのスレッドが、CakePHPと関係ないネタで盛り上がってる・・・、流行る前兆かも
Popularity: 31 %
by 赤がすき 










これにメール認証の処理ってマージできませんか?
実際使うとなると最低限必要ですし、Bekaryのソースを流用しようと思ったのですが、Authコンポーネントを使ってないようなので、パスワードの暗号化のタイミングがわからなくて困っています。
logueさん、こんにちはコメントありがとうございます。
Bekaryのソースを読んだことがないのですが(←ダメな子認定)、
ここでいうメール認証と言うのは、ユーザ認証後に、登録されたメールアドレスの存在チェックのことでしょうか?
(かの有名な「けんすう」さんエントリみたいなヤツ?)
http://blog.ideami.jp/archives/63
だとすれば
ユーザ登録及びメール認証時はauthコンポーネントはパスワードの保存だけで使ってもいいと思います
(逆に言うと、Bekaryのソースを流用するなら、パスワードの保存時と、ログイン・ログアウト処理をauthコンポーネントに変えれば良さそうな気がします)
ユーザ登録処理
前提:
メールの認証したかどうかをUserテーブルのverifiedで管理
メール認証に必要な情報をハッシュ化したものをUserテーブルのconfirmで管理
1.ユーザ登録(Userテーブルのverifiedを0にする)
パスワードは、http://blog.ne2ma2.com/archives/161に書いてあるとおり自分で暗号化し保存、
$this->Auth->password( パスワード );
メール認証に必要な情報をハッシュ化したものをUserテーブルのconfirmに保存
2.ユーザにメールを送る
3.ユーザが送られたメールについているURLをクリック
(メール認証に必要な情報をハッシュ化したもの)
4.クリックされたURLからメール認証を完了(Userテーブルのverifiedを1にする)
ログイン処理
Userテーブルのverifiedが1のものだけ、ログインさせる
Authコンポーネントの/ログインできるユーザの条件を
データベースのフィールドの値で指定
$this->Auth->userScope = array(’User.verified’ => 1);
実際にはconfirmの有効期限とか、別途必要だと思いますが、こんな感じでどうでしょうか?