2012-05-10 6 views
1

Я пытаюсь реализовать zend ACL в моем проекте, я столкнулся с тремя проблемами. Чтобы объяснить проблемы это код:zend acl Модульная реализация?

Моя библиотека классов плагин

class Mylib_Controller_Plugin_AccessCheck extends Zend_Controller_Plugin_Abstract { 

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

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

    public function preDispatch(Zend_Controller_Request_Abstract $request) { 
     $module = $request->getModuleName(); 
     $recourse = $request->getControllerName(); 
     $action = $request->getActionName(); 
      $identity = $this->auth->getStorage()->read(); 
    if (!isset($identity->Role)) { 

      $role = 'default'; 
     } else { 
     $role = $identity->Role; 
     } 

     if (!$this->_acl->isAllowed($role, $module, $recourse)) { 
      $request->setModuleName('Admin') 
        ->setControllerName('User') 
        ->setActionName('index'); 
     } 


    } 

} 

Это мой ACL класс в папке модели

class Application_Model_DbTable_LibraryAcl extends Zend_Acl { 

    public function __construct() { 
     $this->addRole(new Zend_acl_Role('default')); 
     $this->addRole(new Zend_acl_Role('User')); 
     $this->addRole(new Zend_acl_Role('Admin'), 'User'); 



     $this->add(new Zend_Acl_Resource('Admin')) 
       ->add(new Zend_Acl_Resource('default')) 

     ; 



     $this->allow('Admin') 
       ->deny(array('User', 'default')); 

    } 

} 

Это _initAppAutoload в bootstarp

$acl = new Application_Model_DbTable_LibraryAcl(); 

     $auth = Zend_Auth::getInstance(); 


     $fc = Zend_Controller_Front::getInstance(); 

     $fc->setControllerDirectory(array('default' => '/../application/modules/default/controllers', 
      'Admin' => '/../application/modules/Admin/controllers')); 
     $fc->registerPlugin(new Hyderlib_Controller_Plugin_AccessCheck($acl, $auth)); 

1) первая проблема заключается в том, как я могу указать в A pplication_Model_DbTable_LibraryAcl, что у меня модульная реализация с папками администратора и по умолчанию или как я могу создать дерево ресурсов для каждого модуля?

2) У меня нет роли по умолчанию в моей базе данных, но я хочу, чтобы этот пользователь по умолчанию имел некоторые превалиги, не создавая учетную запись (Вот почему я проверяю личность роли и если она не установлена ​​мной по умолчанию). является ли лучшая практика для этого или даже логичной?

3) как я могу проверить свой класс Mylib_Controller_Plugin_AccessCheck в методе _isAllowed для действия тоже не только для модуля и контроллера.?

Кроме того, этот способ перенаправления также дает мне ошибку не перенаправлять правильно

ответ

0

Здесь идет,

1) первая проблема заключается в том, как я могу указать в Application_Model_DbTable_LibraryAcl, что я имеют модульную реализацию с папками администратора и по умолчанию или как я могу создать дерево ресурсов для каждого модуля ?

Вы довольно близко уже, для базовой реализации:

class Application_Model_DbTable_LibraryAcl extends Zend_Acl { 

public function __construct() { 
    //add Roles 
    //default role has very limited access 
    $this->addRole(new Zend_acl_Role('default')); 
    //User inherits all default access 
    $this->addRole(new Zend_acl_Role('User'), 'default'); 
    //Admin inherits all User and Default acces 
    $this->addRole(new Zend_acl_Role('Admin'), 'User'); 

    //add resources, caps don't seem to be a problem. 
    //add Admin module resource 
    $this->add(new Zend_Acl_Resource('admin')); 
    //add Admin module Index controller resource, specify admin as parent 
    $this->add(new Zend_Acl_Resource('index'), 'admin'); 
    //add default module access 
    $this->add(new Zend_Acl_Resource('default')); 

    //add access rules 
    //default in Zend_Acl is to deny all 

    //everyone has access to the front page and the error page 
    $this->allow(NULL, 'default', array('index', 'error')); 
    $this->allow(NULL, 'default', array('index', 'index')); 

    //add default user rules 
    //allow default access to login logout 
    $this->allow('default', 'default', array('login', 'logout')); 

    //add crud access for User 
    $this->allow('User', 'default', array('add', 'update')); 

    //admin can do all 
    $this->allow('Admin', NULL); 
    } 

} 

Это, вероятно, не является совершенным, но должно дать вам представление о том, что делать. вы можете проверить результаты по мере необходимости.

2) я не роль по умолчанию в моей базе данных, но я хочу, чтобы этот пользователь по умолчанию иметь некоторую previligaes без создания счета (Вот почему я проверить подлинность роли, и если он нет Я установил его по умолчанию). заключается в том, что наилучшая практика для этого или даже логическая?

Работает для меня, действительно сложно проверить роль пользователя, пока вы не знаете, кто они. Отъезд.

3) Как я могу проверить в моем классе Mylib_Controller_Plugin_AccessCheck в метод _isAllowed для действия тоже не только модуль и контроллер .?

public function preDispatch(Zend_Controller_Request_Abstract $request) { 
     $module = $request->getModuleName(); 
     $recourse = $request->getControllerName(); 
     $action = $request->getActionName(); 
      $identity = $this->auth->getStorage()->read(); 
    if (!isset($identity->Role)) { 
      $role = 'default'; 
     } else { 
      $role = $identity->Role; 
     } 
     //default role is default, if role is not allowed and not set to default send to error controller. 
     if (!$this->_acl->isAllowed($role, $module, $recourse, $action)) { 
      if ($role == 'default'){ 
       $request->setModuleName('default') 
         ->setControllerName('index') 
         ->setActionName('login'); 
      } else { 
       $request->setModuleName('default') 
         ->setControllerName('error') 
         ->setActionName('noauth'); 
     } 

Добавление имени действия в isAllowed(), кажется, работает для моего приложения, но тестирование не Бенн очень обширна. Поэтому используйте с осторожностью. Я, как вы все еще пытаетесь получить мою голову на всем протяжении этих концепций.

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