2010-02-03 149 views
1

背景資料:Zend公司:ACL邏輯視圖助手

我在我的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); 
    } 

} 

回答

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'); 
      } 
     } 
    } 
} 
+0

我已經這樣做了,因爲如果用戶訪問'/管理/ index'和他不」不允許訪問,那麼它會重定向到'/ admin/login',它使用admin模塊的'default.phtml'佈局文件。我想只有一個管理員的佈局文件...其中包含adminPanel的回聲..我的印象是,這是做事的正確方法..留下視圖助手在那裏的回聲,並做acl它的邏輯..如果例如有多個區域/視圖助手需要不同的訪問級別?會不會有一個單獨的佈局? – 2010-02-03 23:16:35