Zend_ACL с модульной структурой? - PullRequest
3 голосов
/ 03 декабря 2009

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

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

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

Ответы [ 3 ]

2 голосов
/ 04 декабря 2009

Это абсолютно так. Это то, что мы делаем в нашем проекте. Мы аутентифицируем пути URI ($request->getPathInfo()), например: /admin/user/edit. Здесь «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"
1 голос
/ 27 сентября 2011

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

В вашем случае вы должны определить ресурс (в acl) как некоторую строку, которая может быть сопоставлена ​​с компоновкой модуля / контроллера. Например, для модуля foo и контроллера bar определите ресурс "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
}
}
1 голос
/ 04 декабря 2009

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

...