この問題解決しました!「CakePHP Authコンポーネントが使えない(解決編) 」をご覧ください。
ログイン認証を手作りしてたんですが、「セッションが切れたらログイン画面に戻るように作りたいなぁ」 と思ってWEBで調べてたら「Authコンポーネント」なるものがあるそうではないですか! これは使わない手はない!むしろ車輪の再発明なんかしてたら滅びる!!
……ってことで使い始めましたが、てんで使えないコですねこれ。 WEBで調べれば調べるほどみんな苦労しているのがわかります。
公式マニュアルやたいていのサイトには↓こんな感じで書いてあります。
CREATE TABLE users ( id INT auto_increment, username VARCHAR(50), password VARCHAR(70), PRIMARY KEY(id) );
/** ログアウト処理 */ public function logout() { $this->redirect($this->Auth->logout()); }
<?php if ($this->Session->check('Message.auth')) { echo $this->Session->flash('auth'); } echo $this->Form->create('User', array('action' => 'login')); echo $this->Form->input('username'); echo $this->Form->input('password'); echo $this->Form->end('ログイン');
var $components = array('Auth', 'Session'); public function beforeFilter() { parent::beforeFilter(); //$this->Auth->userModel = 'users'; //$this->Auth->fields = array('username' => 'username', 'password' => 'password'); //$this->Auth->loginAction = array('admin' => false, 'controller' => 'users', 'action' => 'login'); $this->Auth->allow('login', 'logout'); $this->Auth->loginError = "パスワードもしくはログインIDをご確認下さい。"; $this->Auth->authError = "ご利用されるにはログインが必要です。"; //$this->Auth->autoRedirect = false; //$this->Auth->loginRedirect = array('controller' => 'users', 'action' => 'add'); }
ログインボタンを押してもログイン画面に戻ってきちゃいます。本当は「最初にアクセスしようとしたページ」にリダイレクトされるはずなのですが、たとえば次のような状態になります。
$this->Auth->autoRedirect = false;
した後、loginメソッドに何か書けばよいというサイトもあるので、そこをまねして書いてみましたがなかなかうまくいきませんでした。 たいていのサイトではこんな感じで書いてあります。
function login() { if ($this->Auth->user()) { $this->redirect($this->Auth->redirect()); } }
$this->Auth->redirect() は
$this->Auth->loginRedirect = array('controller' => 'users', 'action' => 'add');
で設定したやつが返ってくるんだと思いますが、それはそれとして、 $this->Auth->user() が何度やってもnullを返します。
結局、http://helog.jp/php/cakephp/1228/ に載っていたソースを参考に、次のように書いたところ ようやく遷移するようになりました。
public function login() { if(isset($this->request->data['User']['password'])){ $this->data['User']['password'] = $this->Auth->password($this->request->data['User']['password']); // ログイン成功 if($this->Auth->login($this->request->data)){ $this->redirect($this->Auth->loginRedirect); } else{ $this->Session->setFlash("ログインに失敗しました。"); } } }
ただ、こうするとただログインボタンを押すだけでもログインできちゃいますね。 てことでNG。
CakePHP 1.3系でやってみよう。
って、やってみたらすんなりできました。
CakePHPでAuthコンポーネントを使ってみる(Cake1.3.12版) | helog
http://helog.jp/php/cakephp/1722/
▲主にここを参考にしました。
なんだ?2.0系のAuthコンポーネントはバグってるのか!?
それとも単に2.0系ではやり方が変更になっていて、そこにたどり着いていないだけか!?