忍び歩く男 - SLYWALKER

大阪のこっそりPHPer

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;
    }
}
?>