CakePHPのACL(Access Control List)の解説を砕いてみる~ACO の作成を自動化するツール~


CakePHPのACL(Access Control List)の解説を砕いてみる~ACO の作成~の続き。

ここでやるべきこと。

  1. ACO テーブルを自動的に構築する機能を追加する
  2. ACO テーブルを自動的に構築する
  3. ACO テーブルを自動的に構築する機能を削除する
  4. AuthComponent を無効化するコードを除去

ACO テーブルを自動的に構築する機能を追加する

CakePHPのACL(Access Control List)の解説を砕いてみる~Auth を追加する準備~ - 4丁目よりでapp/配下に格納したapp_controller.phpを修正する

<?php
/* SVN FILE: $Id: app_controller.php 7296 2008-06-27 09:09:03Z gwoo $ */
/**
 * Short description for file.
 *
 * This file is application-wide controller file. You can put all
 * application-wide controller-related methods here.
 *
 * PHP versions 4 and 5
 *
 * CakePHP(tm) :  Rapid Development Framework <http://www.cakephp.org/>
 * Copyright 2005-2008, Cake Software Foundation, Inc.
 *								1785 E. Sahara Avenue, Suite 490-204
 *								Las Vegas, Nevada 89104
 *
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 *
 * @filesource
 * @copyright		Copyright 2005-2008, Cake Software Foundation, Inc.
 * @link				http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project
 * @package			cake
 * @subpackage		cake.cake.libs.controller
 * @since			CakePHP(tm) v 0.2.9
 * @version			$Revision: 7296 $
 * @modifiedby		$LastChangedBy: gwoo $
 * @lastmodified	$Date: 2008-06-27 02:09:03 -0700 (Fri, 27 Jun 2008) $
 * @license			http://www.opensource.org/licenses/mit-license.php The MIT License
 */
/**
 * This is a placeholder class.
 * Create the same file in app/app_controller.php
 *
 * Add your application-wide methods in the class below, your controllers
 * will inherit them.
 *
 * @package		cake
 * @subpackage	cake.cake.libs.controller
 */
class AppController extends Controller {


    var $components = array('Auth', 'Acl');

    function beforeFilter() {
        $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');
    }

    //-----add--start--mitsugi-bb-------
  /**
   * アプリケーションの現在のコントローラにもとづき、 ACL を再構築する
   *
   * @return void
   */
    function buildAcl() {
        $log = array();
 
        $aco =& $this->Acl->Aco;
        $root = $aco->node('controllers');
        if (!$root) {
            $aco->create(array('parent_id' => null, 'model' => null, 'alias' => 'controllers'));
            $root = $aco->save();
            $root['Aco']['id'] = $aco->id; 
            $log[] = 'Created Aco node for controllers';
        } else {
            $root = $root[0];
        }   
 
        App::import('Core', 'File');
        $Controllers = Configure::listObjects('controller');
        $appIndex = array_search('App', $Controllers);
        if ($appIndex !== false ) {
            unset($Controllers[$appIndex]);
        }
        $baseMethods = get_class_methods('Controller');
        $baseMethods[] = 'buildAcl';
 
        // app/controllers 中の、どのコントローラか調べる
        foreach ($Controllers as $ctrlName) {
            App::import('Controller', $ctrlName);
            $ctrlclass = $ctrlName . 'Controller';
            $methods = get_class_methods($ctrlclass);
 
            // コントローラノードを探し、作成する
            $controllerNode = $aco->node('controllers/'.$ctrlName);
            if (!$controllerNode) {
                $aco->create(array('parent_id' => $root['Aco']['id'], 'model' => null, 'alias' => $ctrlName));
                $controllerNode = $aco->save();
                $controllerNode['Aco']['id'] = $aco->id;
                $log[] = 'Created Aco node for '.$ctrlName;
            } else {
                $controllerNode = $controllerNode[0];
            }
 
            // 親コントローラとプライベートのアクションを削除する
            foreach ($methods as $k => $method) {
                if (strpos($method, '_', 0) === 0) {
                    unset($methods[$k]);
                    continue;
                }
                if (in_array($method, $baseMethods)) {
                    unset($methods[$k]);
                    continue;
                }
                $methodNode = $aco->node('controllers/'.$ctrlName.'/'.$method);
                if (!$methodNode) {
                    $aco->create(array('parent_id' => $controllerNode['Aco']['id'], 'model' => null, 'alias' => $method));
                    $methodNode = $aco->save();
                    $log[] = 'Created Aco node for '. $method;
                }
            }
        }
        debug($log);
    }
    //-----add--end--mitsugi-bb-------

}
?>

ACO テーブルを自動的に構築する

http://ドメイン/users/buildAcl  にアクセスする

アクセスすると、Missing Viewのエラーになるけども無視する。
そしてacosテーブルを確認してデータが追加されていればOK

ACO テーブルを自動的に構築する機能を削除する

上記で追加した function buildAcl() を削除する

AuthComponent を無効化するコードを除去

CakePHPのACL(Access Control List)の解説を砕いてみる~Auth を追加する準備~ - 4丁目よりで追加したAuthComponent を無効化するコードを外す

groups_controller.php

<?php
//-----add--start--mitsugi-bb-------
    function beforeFilter() {
        parent::beforeFilter(); 
        $this->Auth->allowedActions = array('*');
    }
//-----add--end--mitsugi-bb-------
?>

users_controller.php

<?php
//-----add--start--mitsugi-bb-------
    function beforeFilter() {
        parent::beforeFilter(); 
        $this->Auth->allowedActions = array('*');
    }
//-----add--end--mitsugi-bb-------
?>

次のページではパーミッションの設定を行っています。
次のページはまた今度(ぁ