CakePHP:認証

最終更新日時:2010-08-02 17:14:33
CakePHP

概要


CakePHP では簡単に認証の機構を設けることが出来ます。
マニュアルにも詳細が載っていますが、ここでは単純な認証を実装する例を紹介します。

実装方法


まず、認証させたいコントローラに対して、以下のように Auth コンポーネントを使用することを明記します。
これにより、このコントローラが使用される際には認証を行うような動きになります。

 class FooController extends AppController {
    var $components = array('Auth');


もし、ほぼ全ての場面で認証を行いたいのであれば、以下のように AppController に追加してしまうのが手っ取り早いです。

 class AppController extends Controller {
    var $components = array('Auth');


次に、認証のための DB の設定を行います。
マニュアルの記述そのままですが、MySQL でいうところの以下のようなテーブルを作成します。
このテーブルが認証に用いるテーブルとなります。

 CREATE TABLE users (
    id integer auto_increment,
    username char(50),
    password char(50),
    PRIMARY KEY (id)
 );


次に、上記テーブルのコントローラを作成します。
ファイル名は、users_controller.php となります。
これもほとんどマニュアルの記述そのままなのですが、Session コンポーネントが明示的に追加されているところに注意してください。
これは 1.3 からは明示的に Session コンポーネントを指定しないと読み込まれないことによります。

 class UsersController extends AppController {
    var $name = 'Users';    
    var $components = array('Auth', 'Session'); 
 
    function login() {
    }
 
    function logout() {
        $this->redirect($this->Auth->logout());
    }
 }


最後に users のビュー、すなわちログイン画面を作成します。
例えば以下のような感じですが、ここで1つ注意。
$session->flash('auth'); は 1.3 では明示的に echo しないと出力をしないようです。

 <?php
 $this->set('title_for_layout', 'ログイン');
 if  ($session->check('Message.auth')) echo $session->flash('auth');
 echo $form->create('User', array('action' => 'login'));
 ?>
 <table class="default" cellpadding="10">
 <tr>
  <th>ログインID</th>
  <td>
   <?php
   echo $form->text('username', array('size'=>'64'));
   ?>
  </td>
 </tr>
 <tr>
  <th>パスワード</th>
  <td>
   <?php
   echo $form->password('password', array('size'=>'64'));
   ?>
  </td>
 </tr>
 </table>
 
 <?php
 echo $form->end('ログイン');
 ?>


セッションについて


認証情報はセッションにて保持されますので、認証とセッションは密接に関連しています。
例えば、認証の有効時間等の設定をしたければ、core.php の Security.level 等のセッション関連の設定を変更することで実現できます。

ちなにに、CakePHP では、ブラウザを閉じた時にセッションを破棄するという、わりと当たり前な動作が設定できないようになっています。
これはつまり、ブラウザを閉じても有効期間を過ぎなければログイン状態が保持されることを意味します。
これはこれで便利なこともあるのですが、ブラウザを閉じた際にログアウト状態にできない、、、のは問題ですので、以下の変更を行うことをおすすめします。

cake/libs/cake_session.php

 470c470
 <                               $this->cookieLifeTime = Configure::read('Session.timeout') * Security::inactiveMins();
 ---
 >                               $this->cookieLifeTime = 0;


上記は、Cookie の有効期間を 0、つまりブラウザを閉じた時点で破棄することとなり、それに伴いセッションも破棄され、ログアウト状態となります。
※ 上記は Security.level = high の場合のみ修正

その他補足等


参考までに、user_controller.php の最終形?を載せておきます。
補足としては、、、

・ beforeFilter で、メソッドが呼び出される前に実行するコードを記述
・ $this->Auth->allow で、認証を行わないメソッドを指定
・ this->Auth->loginError で、ログインに失敗した際のメッセージを指定
・ $this->Auth->authError で、認証に失敗した際(リダイレクト)のメッセージを指定
・ ユーザー登録用のメソッド add を追加
・ フォーム以外からの登録用のメソッド save_hash を追加

 <?php
 class UsersController extends AppController {
    var $components = array('Auth', 'Session');
 
    function beforeFilter() {
        $this->Auth->allow('add');
        $this->Auth->loginError = 'パスワードが違います。';
        $this->Auth->authError = '管理者用のページです。';
    }
  
    function login() {
    }
 
    function logout() {
        $this->redirect($this->Auth->logout());
    }
 
    function add() {
        if (!empty($this->data)) {
            $this->User->create();
            $this->User->save($this->data['User']);
            $this->redirect(array('controller' => 'forms', 'action' => 'admin'));
        }
    }
 
    function save_hash($input_data) {
        $this->save($insert_data);
    }
 }
 ?>


お問い合わせは 掲示板 にて。