2010-02-03 2 views
1

Справочная информация:Zend: ACL логика Помощники

Я в моем admin модуле, и я создал помощник вида в modules/admin/views/helpers/AdminPanel.php. У меня есть плагин макета, который заставляет мое представление использовать макет в admin/views/layouts/default.phtml.

Я пытаюсь получить доступ к объекту ACL, чтобы определить, есть ли у пользователя ресурсы в контексте помощника вида, а затем определить, следует ли возвращать html панели администратора, анализируя configs/admin-nav.xml или вообще ничего не вернуть.

Я звоню это в моем макете админ так:

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

и класс код, который является пустым, что мне нужно, чтобы получить доступ к объекту аКЛ в:

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 плагин должен заботиться о логике доступа, а не ваше мнение. Если у пользователя нет доступа к ресурсу, вы должны сделать ошибку или перенаправить пользователя в другое место.

Макет должен быть установлен в контроллере. Предпочтительно в способе инициализации() с:

$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' и он Безразлично» t иметь доступ, не разрешен, затем он перенаправляется на '/ admin/login', который использует файл макета' default.phtml' модуля администратора. Я хотел бы иметь только один файл макета для администратора ..., который содержит эхо для adminPanel .. У меня сложилось впечатление, что это правильный способ делать что-то .. оставляя эхо для помощника вида там и делай acl логика в нем .. что, если, например, есть несколько регионов/просмотр помощников, которым нужны разные уровни доступа? будет ли отдельный макет для каждого? –

Смежные вопросы