1

背景情報:

私は自分のadminモジュールにいて、でビューヘルパーを作成しましたmodules/admin/views/helpers/AdminPanel.php。ビューにのレイアウトを使用するように強制するレイアウトプラグインがありますadmin/views/layouts/default.phtml

ACLオブジェクトにアクセスして、ユーザーがビューヘルパーのコンテキストでリソースを持っているかどうかを判断し、configs/admin-nav.xmlを解析して管理パネルのhtmlを返すかどうかを判断しようとしています。まったく。

私はそれを私の管理者レイアウトで次のように呼んでいます:

<?php echo $this->AdminPanel(); ?>

そして、空白のクラスコードは、次のaclオブジェクトにアクセスする必要があります。

class My_View_Helper_AdminPanel extends Zend_View_Helper_Abstract {

public function AdminPanel() {}

}

私はこれを試しました:

$acl = Zend_Controller_Action_HelperBroker::getStaticHelper('acl');

しかし、これはおそらく私が探しているものではありません。デフォルトのモジュールを強制的views/layouts/default.phtmlにロードし、エラーが発生するからです。

これが私のグローバルブートストラップファイルです:

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

    private $_acl = null;
    private $_auth = null;

    protected function _initDoctype() {
    $this->bootstrap('view');
    $view = $this->getResource('view');
    $view->setEncoding('UTF-8');
    $view->doctype('HTML4_STRICT');
    }

    protected function _initAutoload() {
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->registerNamespace('KG_');
    $resourceLoader = new Zend_Loader_Autoloader_Resource(
        array(
        'basePath' => APPLICATION_PATH,
        'namespace' => '',
        'resourceTypes' => array(
            'form' => array(
            'path' => 'forms/',
            'namespace' => 'Form_'
            ),
            'model' => array(
            'path' => 'models/',
            'namespace' => 'Model_'
            )
        )
        ));
    return $autoloader;
    }

    protected function _initAclAuth() {
    $this->_acl = new Model_Acl;
    $this->_auth = Zend_Auth::getInstance();
    }

    protected function _initNav() {
    $this->bootstrap('layout');
    $layout = $this->getResource('layout');
    $view = $layout->getView();
    $config = new Zend_Config_Xml( APPLICATION_PATH . '/configs/nav.xml', 'mainNav');
    $navigation = new Zend_Navigation( $config );

    $fc = Zend_Controller_Front::getInstance();
    $fc->registerPlugin( new KG_Controller_Plugin_Acl( $this->_acl, $this->_auth ) );

    $role = $this->_auth->getStorage()->read()->role;

    if ( !$role ) {
        $role = 'guest';
    }

    $view->navigation( $navigation )->setAcl( $this->_acl)->setRole( $role );
    }


    protected function _initEncoding() {
    $fc = Zend_Controller_Front::getInstance();
    $response = new Zend_Controller_Response_Http;
    $response->setHeader('Content-Type','text/html;charset=utf-8', true);
    $fc->setResponse($response);
    }

}
4

1 に答える 1

2

プラグKG_Controller_Plugin_Aclインは、ビューではなく、アクセスロジックを処理する必要があります。ユーザーがリソースにアクセスできない場合は、エラーを発生させるか、ユーザーを別の場所にリダイレクトする必要があります。

レイアウトはコントローラー内で設定する必要があります。できれば、init()メソッドで次のようにします。

$this->_helper->layout->setLayout();

Zend_Aclで行ったのと同じまたは同様のチュートリアルに従ったようです。プラグインを参照用に投稿しています。これには、プラグイン内からアクセス制御を処理するロジックが含まれています。

class App_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract
{

    protected $_auth = null;
    protected $_acl = null;

    public function __construct(Zend_Auth $auth, Zend_Acl $acl)
    {
        $this->_auth = $auth;
        $this->_acl = $acl;
    }

    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        if ($this->_auth->hasIdentity()) {
            $identity = $this->_auth->getIdentity();
            $role = $identity->acl_role;
        } else {
            $role = 'guest';
        }

        // Mapping to determine which Resource the current
        // request refers to (really simple for this example!)
        $resource = $request->controller;
        $privilege = $request->action;


        if (!$this->_acl->has($resource)) {
            $resource = null;
        }

        // ACL Access Check
        if (!$this->_acl->isAllowed($role, $resource, $privilege)) {
            if ($this->_auth->hasIdentity()) {
                // authenticated, denied access, forward to /error/permissions
                $request->setModuleName('default');
                $request->setControllerName('error');
                $request->setActionName('permissions');
            } else {
                // not authenticated, forward to login form
                $request->setModuleName('default');
                $request->setControllerName('auth');
                $request->setActionName('login');
            }
        }
    }
}
于 2010-02-03T23:00:11.527 に答える