cakePHP チュートリアル「ACL を制御するシンプルなアプリケーション」 その1

概要

cakePHPのチュートリアル「ACL を制御するシンプルなアプリケーション」を実践したときの備忘録

ダウンロードと初期設定

  1. まずはcakePHPをダウンロード。
    http://cakephp.org/から現在の安定版1.2.5をダウンロードしてweb領域にセットします。

  2. 続いてDBの設定。
    「cake_tutorial」というDBを作成して以下のテーブルを作成。

    CREATE TABLE users (
        id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    	username VARCHAR(255) NOT NULL UNIQUE,
        password CHAR(40) NOT NULL,
        group_id INT(11) NOT NULL,
        created DATETIME,
        modified DATETIME
    );
    
     
    CREATE TABLE groups (
        id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(100) NOT NULL,
        created DATETIME,
        modified DATETIME
    );
    
    
    CREATE TABLE posts (
        id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
        user_id INT(11) NOT NULL,
        title VARCHAR(255) NOT NULL,
        body TEXT,
        created DATETIME,
        modified DATETIME
    );
    
    CREATE TABLE widgets (
        id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(100) NOT NULL,
        part_no VARCHAR(12),
        quantity INT(11)
    );
    

ここまで出来たら後はbakeでサクッと作成しちゃいます。

bakeでアプリケーション作成

  1. コマンドプロンプトを立ち上げ、cake/appフォルダまで移動。

    $ cd c\var\www\cake_tutorial\app
    
  2. cakeコマンドで「bake all」を渡します。

    $ ..\cake\console\cake bake all
    

    すると以下の様に表示されますので「1」を指定して『Group』のMVCを作成します。

    > ..\cake\console\cake bake all
    
    Welcome to CakePHP v1.2.4.8284 Console
    ---------------------------------------------------------------
    App : app
    Path: C:\var\www\cake_tutorial\app
    ---------------------------------------------------------------
    ---------------------------------------------------------------
    Bake All
    ---------------------------------------------------------------
    Possible Models based on your current database:
    1. Group
    2. Post
    3. User
    4. Widget
    Enter a number from the list above, type in the name of another model, or 'q' to
     exit
    [q] > 1
    
  3. 続けて「2」「3」「4」と指定してそれぞれのMVCを作成。これで基本アプリケーションの作成は終了。
    bakeって楽チン!

ログインページの作成

次は先ほどbakeによって作成されたファイルをカスタマイズしていきます。

  1. まずは[\app\controllers\users_controller.php]の編集から。
    ログインとログアウトのアクションを追加します。

    function login() {
      // 認証のからくり
    }
    function logout() {
      // ここは、今は空にしておいてください
    }
    
  2. つぎにログインページのビューの作成。
    ログアウトはログインページにジャンプさせるのでビューを作らなくてもOK.
    [\app\views\users]に「login.ctp」ファイルを作成して以下の内容を記述。

    $session->flash('auth');
    echo $form->create('User', array('action' => 'login'));
    echo $form->inputs(array(
    	'legend' => __('Login', true),
    	'username',
    	'password'
    ));
    echo $form->end('Login');
    

    この辺はチュートリアルどおりだから問題ないね。

  3. 続いて、コントローラ全体に認証と ACL の設定を行います。
    [\app]に「app_controller.php」ファイルを作成して以下の内容を記述。
    「bake all」コマンドを実行したら「app_controller.php」ファイルはもう作成済みですね。
    その中に以下の内容を記述していきます。

    <?php
    class AppController extends Controller {
        var $components = array('Acl', 'Auth');
    
        function beforeFilter() {
            // AuthComponent の設定
            $this->Auth->authorize = 'actions';
            $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
            $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
            $this->Auth->loginRedirect = array('controller' => 'posts', 'action' => 'add');
        }
    }
    ?>
    

    これを書いちゃうとどこにアクセスしてもログインページに飛ばされちゃいます。
    User、Groupはまだ作っていないのでログインできません。

  4. 次はUser、Groupは認証しなくても操作できるようにアクセス解除しましょう。
    [\app\controllers\]の「users_controller.php」と「groups_controller.php」に以下の内容を追加します。

    function beforeFilter() {
        parent::beforeFilter(); 
        $this->Auth->allowedActions = array('*');
    }
    

    でもまだエラーがでて接続できません。

ACLの設定

  1. だんだん難しくなってきました。
    とりあえずチュートリアルどおりにスキーマファイルを実行します。

    > ..\cake\console\cake schema run create DbAcl
    
    Welcome to CakePHP v1.2.4.8284 Console
    ---------------------------------------------------------------
    App : app
    Path: C:\var\www\cake_tutorial\app
    ---------------------------------------------------------------
    Cake Schema Shell
    ---------------------------------------------------------------
    
    The following table(s) will be dropped.
    acos
    aros
    aros_acos
    
    Are you sure you want to drop the table(s)? (y/n)
    [n] > y
    Dropping table(s).
    acos updated.
    aros updated.
    aros_acos updated.
    
    The following table(s) will be created.
    acos
    aros
    aros_acos
    
    Are you sure you want to create the table(s)? (y/n)
    [y] >
    Creating table(s).
    acos updated.
    aros updated.
    aros_acos updated.
    End create.
    1. DROP TABLE IF EXISTS `acos`;
    
    2. DROP TABLE IF EXISTS `aros`;
    
    3. DROP TABLE IF EXISTS `aros_acos`;
    
    4. CREATE TABLE `acos` (
            `id` int(10) NOT NULL AUTO_INCREMENT,
            `parent_id` int(10) DEFAULT NULL,
            `model` varchar(255) DEFAULT NULL,
            `foreign_key` int(10) DEFAULT NULL,
            `alias` varchar(255) DEFAULT NULL,
            `lft` int(10) DEFAULT NULL,
            `rght` int(10) DEFAULT NULL,    PRIMARY KEY  (`id`));
    
    
    5. CREATE TABLE `aros` (
            `id` int(10) NOT NULL AUTO_INCREMENT,
            `parent_id` int(10) DEFAULT NULL,
            `model` varchar(255) DEFAULT NULL,
            `foreign_key` int(10) DEFAULT NULL,
            `alias` varchar(255) DEFAULT NULL,
            `lft` int(10) DEFAULT NULL,
            `rght` int(10) DEFAULT NULL,    PRIMARY KEY  (`id`));
    
    
    6. CREATE TABLE `aros_acos` (
            `id` int(10) NOT NULL AUTO_INCREMENT,
            `aro_id` int(10) NOT NULL,
            `aco_id` int(10) NOT NULL,
            `_create` varchar(2) DEFAULT '0' NOT NULL,
            `_read` varchar(2) DEFAULT '0' NOT NULL,
            `_update` varchar(2) DEFAULT '0' NOT NULL,
            `_delete` varchar(2) DEFAULT '0' NOT NULL,      PRIMARY KEY  (`id`),
            UNIQUE KEY `ARO_ACO_KEY` (`aro_id`, `aco_id`));
    

    テーブルが3つ作成されました。

  2. 次もなんだかよく分かりませんが、言われるままにソースコードを編集していきましょう。

    [\app\models\]の「user.php」から。
    「bake all」で$nameと$belongsToは作成されていますので以下の内容だけ一番下に追加することにします。

    var $actsAs = array('Acl' => 'requester');
     
    function parentNode() {
        if (!$this->id && empty($this->data)) {
            return null;
        }
        $data = $this->data;
        if (empty($this->data)) {
            $data = $this->read();
        }
        if (!$data['User']['group_id']) {
            return null;
        } else {
            return array('Group' => array('id' => $data['User']['group_id']));
        }
    }
    

    [\app\models\]の「group.php」も同様に一番下に以下の内容を追加します。

    var $actsAs = array('Acl' => array('requester'));
     
    function parentNode() {
        return null;
    }
    

    UserとGroupのツリー構造みたいですね。

  3. いよいよGroupとUserの登録です。
    http://localhost/cake_tutorial/groups にアクセスして、「administrators」「managers」「users」を追加します。

    次にUserの追加。
    http://localhost/cake_tutorial/users にアクセスして、「user1」「user2」「user3」をそれぞれ異なるGroupで追加します。

  4. ユーザを変更する場合は、ARO を手動で更新しなければならないそうで。
    [\app\models\]の「user.php」の一番下に以下の内容を追加します。

    /**    
     * After save callback
     *
     * user の aro を更新する *
     * @access public
     * @return void
     */
    function afterSave($created) {
            if (!$created) {
                $parent = $this->parentNode();
                $parent = $this->node($parent);
                $node = $this->node();
                $aro = $node[0];
                $aro['Aro']['parent_id'] = $parent[0]['Aro']['id'];
                $this->Aro->save($aro);
            }
    }
    

本日は疲れたのでここまで。次回は「ACO の作成」から行います。

投稿日:

ページのトップへ戻る