CakePHP1.3 + Auth (アクセス制御 認証編)についてのメモ

■環境

  • VirtualBox 4.0.0
  • ホストOS: Windows7
  • ゲストOS: CentOS 5.5
  • WebServer: Apache
  • 言語: PHP 5.1.6
  • IDE: Eclipse
  • バージョン管理: SVN

■CakePHP初期設定

  • CakePHPインストール
    • 普通にCakePHPをダウンロードして配置
  • CakePHP初期設定
    • Security.saltとSecurity.cipherSeedを変更
    • database.php設定など

■データベース/テーブル作成

  • データベースを作成

    % echo “CREATE DATABASE actrl;” | mysql -u root

  • テーブルを作成

    % mysql -u root actrl
    mysql> CREATE TABLE users (
    id integer auto_increment,
    username char(50),
    password char(50),
    PRIMARY KEY (id)
    );

■UserモデルCRUD作成

  • UserモデルCRUD作成

    /path/to/cake/console/cake bake

  • モデル/コントローラ/ビューを作成

■Authコンポーネント設定

  1. UsersControllerにAuth追加
    	var $components = array('Auth');
    
  2. 必要なメソッド追加
    	function login() {
        }
    
        function logout() {
            $this->redirect($this->Auth->logout());
        }
    
  3. View(app/views/users/login.ctp)追加
    File: app/views/users/login.ctp

    <?php
        if  ($session->check('Message.auth')) $session->flash('auth');
        echo $form->create('User', array('action' => 'login'));
        echo $form->input('username');
        echo $form->input('password');
        echo $form->end('Login');
    ?>
    

■アカウント追加

  1. 一時的に認証許可を行う
    	function beforeFilter() {
            $this->Auth->allow('index','add');
    	}
    
  2. 画面よりアカウント追加を行う

    http://localhost/users/

  3. 一時的な許可(beforeFilter)を削除

■ソースコード

  1. 最終的にソースコードは以下のようになります
  2. モデル
    File: app/models/user.php

    <?php
    class User extends AppModel {
    	var $name = 'User';
    	var $displayField = 'username';
    }
    ?>
  3. コントローラ
    File: app/controllers/users_controller.php

    <?php
    class UsersController extends AppController {
    
     var $name = 'Users';
     var $components = array('Auth');
    
     function beforeFilter() {
    //        $this->Auth->allow('index','add');
     }
    
     function login() {
     }
    
     function logout() {
            $this->redirect($this->Auth->logout());
     }
    
     function index() {
      $this->User->recursive = 0;
      $this->set('users', $this->paginate());
     }
    
     function view($id = null) {
      if (!$id) {
       $this->Session->setFlash(__('Invalid user', true));
       $this->redirect(array('action' => 'index'));
      }
      $this->set('user', $this->User->read(null, $id));
     }
    
     function add() {
      if (!empty($this->data)) {
       $this->User->create();
       if ($this->User->save($this->data)) {
        $this->Session->setFlash(__('The user has been saved', true));
        $this->redirect(array('action' => 'index'));
       } else {
        $this->Session->setFlash(__('The user could not be saved. Please, try again.', true));
       }
      }
     }
    
     function edit($id = null) {
      if (!$id && empty($this->data)) {
       $this->Session->setFlash(__('Invalid user', true));
       $this->redirect(array('action' => 'index'));
      }
      if (!empty($this->data)) {
       if ($this->User->save($this->data)) {
        $this->Session->setFlash(__('The user has been saved', true));
        $this->redirect(array('action' => 'index'));
       } else {
        $this->Session->setFlash(__('The user could not be saved. Please, try again.', true));
       }
      }
      if (empty($this->data)) {
       $this->data = $this->User->read(null, $id);
      }
     }
    
     function delete($id = null) {
      if (!$id) {
       $this->Session->setFlash(__('Invalid id for user', true));
       $this->redirect(array('action'=>'index'));
      }
      if ($this->User->delete($id)) {
       $this->Session->setFlash(__('User deleted', true));
       $this->redirect(array('action'=>'index'));
      }
      $this->Session->setFlash(__('User was not deleted', true));
      $this->redirect(array('action' => 'index'));
     }
    }
    ?>
    
  4. ビュー(login.ctpのみ記載)
    File: app/views/users/login.ctp

    <?php
        if  ($session->check('Message.auth')) $session->flash('auth');
        echo $form->create('User', array('action' => 'login'));
        echo $form->input('username');
        echo $form->input('password');
        echo $form->end('Login');
    ?>