Zend_ACL с модульной структурой?

Я создал MVC с помощью Zend, прочитав http://framework.zend.com/manual/en/zend.controller.modular.html.

Проблема в том, что я не могу найти способ использовать Zend_ACL с модульной структурой. Zend_Acl просто не имеет метода добавления модулей. Это позволяет мне только добавить контроллер и действие.

Как использовать Zend_Acl с модульной структурой? Возможно ли это с текущей версией Zend Framework?


person Moon    schedule 03.12.2009    source источник
comment
что ты имеешь в виду под модулями?   -  person koen    schedule 04.12.2009


Ответы (3)


Совершенно верно. Это то, чем мы занимаемся в нашем проекте. Мы аутентифицируем пути URI ($request->getPathInfo()), например: /admin/user/edit. Здесь «админ» - это модуль, «пользователь» - это контроллер, а «редактировать» - это действие. И у нас есть плагин доступа:

class Our_Application_Plugin_Access extends Zend_Controller_Plugin_Abstract {
    public function preDispatch(Zend_Controller_Request_Abstract $request) {
        foreach (self::current_roles() as $role) {
            if (
                Zend_Registry::get('bootstrap')->siteacl->isAllowed(
                    $role,
                    $request->getPathInfo()
                )
            ) return;
        }

        $this->not_allowed($request);
    }

   ...
}

Зарегистрировано в application.ini:

resources.frontController.plugins.access = "Our_Application_Plugin_Access"
person Ivan Krechetov    schedule 04.12.2009

Другой вариант для Ивана - установить ресурсы вместо просто «контроллера» на sth. вроде «модуль-контроллер».

person Tomáš Fejfar    schedule 04.12.2009

Возможно, пользуюсь каждый раз. Прежде всего помните, что ресурс, который Zend_Acl будет проверять, является произвольной сущностью (строкой), необязательно связанной с конкретным модулем или контроллером. Это может быть строка «hello», и в вашей программе вы можете проверить, может ли пользователь получить доступ к ресурсу «hello». Я часто использую произвольные ресурсы, такие как «кнопка входа в систему», «кнопка выхода из системы», чтобы показать ссылку в Zend_Navigation.

В вашем случае вы должны определить ресурс (в acl) как некоторую строку, которая может быть сопоставлена ​​с макетом модуля / контроллера. Например, для модуля foo и панели контроллера определите ресурс «foo.bar». Затем в процедуре проверки доступа вы прочитаете имя модуля и контроллера и объедините их в строку для получения ресурса.

На практическом примере:

class Application_Plugin_AccessCheck extends Zend_Controller_Plugin_Abstract {

...

public function preDispatch(Zend_Controller_Request_Abstract $request){
    $module = $request->getModuleName();
    $controller = $request->getControllerName();
    $action = $request->getActionName();

...

   $resource = $module . '.' . $controller; //we create the custom resource according to the model we have defined
...

    $role=NULL;
    if($this->_auth->hasIdentity()){
        $identity = $this->_auth->getStorage()->read(); //depending on your implementation
        $role = $identity->role; //depending on your implementation
    }
...

  if(!$this->_acl->isAllowed($role, $resource, $action)){
        //deny access       
    }
    //allow access
}
}
person Emilio A. L.    schedule 27.09.2011