CakePHPのACL(Access Control List)の解説を砕いてみる~ACO の作成を自動化するツール~
CakePHPのACL(Access Control List)の解説を砕いてみる~ACO の作成~の続き。
ここでやるべきこと。
- ACO テーブルを自動的に構築する機能を追加する
- ACO テーブルを自動的に構築する
- ACO テーブルを自動的に構築する機能を削除する
- 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------- ?>
次のページではパーミッションの設定を行っています。
次のページはまた今度(ぁ