端くれプログラマの備忘録 CakePHP [CakePHP] ユーザ登録とログイン認証を実装する (2)

[CakePHP] ユーザ登録とログイン認証を実装する (2)

(前回の続き)

Usersコントローラの設計

以下、Usersコントローラに実装する機能をざっくり定義。実装は後でやる。

// app/Controller/UsersController.php

class UsersController extends AppController {

    // ユーザ登録 (フォームの入力をDBに保存して仮登録し、本登録のためのメールを送信)
    public function signup() {
        //TODO 後で実装
    }
    
    // 本登録
    public function activate($user_id = null, $in_hash = null) {
        //TODO 後で実装
    }
    
    // ログイン
    public function login() {
        //TODO 後で実装
    }
    
    // ログアウト
    public function logout() {
        //TODO 後で実装
    }
    
    // ダッシュボード (ログイン直後に表示されるホーム画面)
    public function dashboard() {
        //TODO 後で実装
    }

    // パスワード変更
    public function password() {
        //TODO 後で実装
    }
}

Authコンポーネントの組み込み

Authコンポーネントを組み込むことで、サイトへのアクセスに認証が必要になる。全てのコントローラに適用する必要があるので、全てのコントローラのベースクラスとなるAppControllerクラスに実装する。

// app/Controller/AppController.php

class AppController extends Controller {
    
    public $components = array('Session', 'Auth');
    
    public function beforeFilter() {
        // ログインを扱うアクション
        $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
        
        // ログイン後のリダイレクト先のアクション
        $this->Auth->loginRedirect = array('controller' => 'users', 'action' => 'dashboard');
        
        // ユーザがログアウトした後のリダイレクト先となるデフォルトのアクション
        $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
        
        // ユーザの権限判定のためにアクティブなコントローラの isAuthorized() の戻り値を使う
        $this->Auth->authorize = array('Controller');
        
        // ユーザのログインに使いたい認証オブジェクトの配列を
        $this->Auth->authenticate = array(
            'Form' => array(
                'userModel' => 'User',
                'fields' => array(
                    'username' => 'username',
                    'password' => 'password'
                ),
                'scope' => array('User.active' => 1)    //本登録済みユーザのみログイン可能
            )
        );
        
        if ($this->Session->check('Auth.User')) {   //ログイン済み
            $loggedin = $this->Session->read('Auth.User');
            $this->set(compact('loggedin'));
        }
    }
    
    // 権限判定チェック
    public function isAuthorized($user) {
        // 必要ならばここで権限判定
        return true;    //許可
    }
}

Usersコントローラの以下の3つのアクションは、未ログインの状態でもアクセスできる必要がある。

  • signup (ユーザ登録)
  • activate (本登録)
  • login (ログイン)

Authコンポーネントのallowメソッドを使って、未ログイン状態でのアクセスを許可しておく。

// app/Controller/UsersController.php

class UsersController extends AppController {

    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow(array('signup', 'activate', 'login'));
    }
    ...
}

(次回へ続く)

全ソース (GitHub)
https://github.com/84kure/cakephp2-sample-auth