InitAclController Aclの初期化コントローラ CakePHP1.2RC2
前回のAuthComponent + AclComponent + AclBehavior CakePHP1.2RC2
で、とりあえず動くものをつっくたが、Acoの登録やパーミッションの設定をコンソールからチマチマやるのが、正直しんどい・・・
というわけで、Aclの初期化コントローラを作ってみた。
参考にしたところは、以下のところ
また、コントローラとアクションをひろってくるために
CakePHP 1.2beta対応−CakeInfo-0.1.2リリース
を使わせて頂いた。感謝!!
下準備
cakeinfo.php の CakeInfoクラスをコンポーネントとして取り込む
app/controllers/components/cake_info.php
<?php class CakeInfoComponent extends Object { //cakeinfo.php の CakeInfoクラスの中身をコピペ }
公開コントローラはAcoに登録しなくていいよねってことで
前回つくったAppControllerを変更(コントローラ名の書き方をちょこちょこっと)
app/app_controller.php
<?php class AppController extends Controller { public $components = array('Acl', 'Auth', 'NoHash'); public $publicControllers = array('Pages', 'InitAcl'); //前回から変更 function beforeFilter() { if (isset($this->Auth)) { $this->Auth->userScope = array('User.disabled' => 0); $this->Auth->authenticate = $this->NoHash; $this->Auth->loginAction = '/users/login'; $this->Auth->loginRedirect = '/users/index'; $this->Auth->authorize = 'actions'; if (in_array(inflector::camelize($this->params['controller']), $this->publicControllers)) { //前回から変更 $this->Auth->allow(); } $this->set('auth', $this->Auth->user()); } } } ?>
InitAclController
http://yourwebroot/init_acl/init
にアクセスすると初期化完了!
app/controllers/init_acl_controller.php
<?php class InitAclController extends AppController { var $name = 'InitAcl'; var $components = array('Acl', 'CakeInfo'); var $uses = null; function _createAro($model, $foreign, $parent, $alias) { $this->Acl->Aro->create(); $this->Acl->Aro->save(array( 'model'=>$model, 'foreign_key'=>$foreign, 'parent_id'=>$parent, 'alias'=>$alias) ); return $this->Acl->Aro->id; } function _createAco($model, $foreign, $parent, $alias) { $this->Acl->Aco->create(); $this->Acl->Aco->save(array( 'model'=>$model, 'foreign_key'=>$foreign, 'parent_id'=>$parent, 'alias'=>$alias) ); return $this->Acl->Aco->id; } function _deleteDB() { $this->Acl->Aro->query("TRUNCATE acos"); //$this->Acl->Aro->query("TRUNCATE aros"); //Aroはフォームから入力するのでコメントアウト $this->Acl->Aro->query("TRUNCATE aros_acos"); } function _createControllersAco() { $root_id = $this->_createAco(null, null, null, "/"); //コントローラとアクションを読み込む $myControllers = $this->CakeInfo->makeControllerValues(); foreach ($myControllers as $myController) { if (!in_array($myController['name'], $this->publicControllers)) { $id = $this->_createAco(null, null, $root_id, $myController['name']); foreach ($myController['action_method'] as $myAction) { $this->_createAco(null, null, $id, $myAction); } } } } function init() { $this->_deleteDB(); $this->_createControllersAco(); //パーミッションの設定は以下のように $aro = array('model' => 'Group', 'foreign_key' => 1); $this->Acl->allow($aro, 'Users', '*'); $aro = array('model' => 'Group', 'foreign_key' => 2); $this->Acl->allow($aro, 'Users/logout', '*'); echo "Rules are initialized"; $this->autoRender = false; } } ?>