PHPMEMO0006

CakePHP Authコンポーネントが使えない


2012.3.21 追記

この問題解決しました!「CakePHP Authコンポーネントが使えない(解決編) 」をご覧ください。


ログイン認証を手作りしてたんですが、「セッションが切れたらログイン画面に戻るように作りたいなぁ」 と思ってWEBで調べてたら「Authコンポーネント」なるものがあるそうではないですか! これは使わない手はない!むしろ車輪の再発明なんかしてたら滅びる!!

……ってことで使い始めましたが、てんで使えないコですねこれ。 WEBで調べれば調べるほどみんな苦労しているのがわかります。

当方の環境

  • OS ... Windows XP SP3
  • Apache ... 2.2.22
  • PHP ... 5.2.17
  • CakePHP ... 2.0.6

オーソドックスな手順

公式マニュアルやたいていのサイトには↓こんな感じで書いてあります。

  1. usersテーブルを用意する。
    テーブル名や列名は設定で変えることもできるようですが、デフォルトどおりでまずは試すのが無難。
    CREATE TABLE users (
       id INT auto_increment,
       username VARCHAR(50),
       password VARCHAR(70),
       PRIMARY KEY(id)
    );
    
  2. モデル、ビュー、コントローラの準備
    bakeすればいいですね。基本4アクション(index,add,edit,delete)は組み込ませます。
  3. loginメソッド、logoutメソッドをコントローラに追加する。
    loginメソッドは空でよい、ということになっています。logoutメソッドは次のように。
       /** ログアウト処理 */
       public function logout() {
           $this->redirect($this->Auth->logout());
       }
    
  4. 上記2メソッド用のCTPファイルも追加する。
    logout.ctpは表示されないので空のダミーファイルでよいようです。login.ctpにはログインフォームとエラーメッセージ出力部分を記述します。
    <?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('ログイン');
    
  5. Authコンポーネントのセットアップ
    コントローラのクラスの最初でコンポーネントの使用宣言、それからパラメータの設定は同じくコントローラのbeforeFilterメソッドに書くみたいです。↓の例ではコメントアウトしまくりですが、これはデフォルト通りで試すためです。
    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');
    }
    

当方で発生したお悩み

ログインボタンを押してもログイン画面に戻ってきちゃいます。本当は「最初にアクセスしようとしたページ」にリダイレクトされるはずなのですが、たとえば次のような状態になります。

  1. http://localhost/cake/users/addを指定する。
  2. 「ご利用されるにはログインが必要です。」の表示とともにログイン画面出現
  3. 正しいユーザ名とパスワードを入力してログインボタン押下
  4. またログインページが表示される。エラーメッセージはなし。

当方の解決への試み

$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系ではやり方が変更になっていて、そこにたどり着いていないだけか!?

最終更新:2012年03月21日 17:11