Это перевод второй части статьи с DevZone об использовании Zend_Acl MVC Zend Framework.
1. Использование модулей
- Контроллер user.
- Контроллер article.
- Контроллер article.
- Контроллер quick-link.
- Контроллер category.
ВАЖНО
Помните, этот код и создание объекта Zend_Acl должны быть выполнены до вызова метода диспетчеризации фронт-контроллера (в файле bootstrap).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | /** Создание Ролей */ require_once 'Zend/Acl/Role.php'; $myAcl->addRole(new Zend_Acl_Role('guest')) ->addRole(new Zend_Acl_Role('writer'), 'guest') ->addRole(new Zend_Acl_Role('admin'), 'writer'); /** Создание Ресурсов */ require_once 'Zend/Acl/Resource.php'; /** Модуль по-умолчанию */ $myAcl->add(new Zend_Acl_Resource('user')) ->add(new Zend_Acl_Resource('article')); /** Административный модуль */ $myAcl->add(new Zend_Acl_Resource('admin')) ->add(new Zend_Acl_Resource('admin:article', 'admin')) ->add(new Zend_Acl_Resource('admin:quick-link', 'admin')) ->add(new Zend_Acl_Resource('admin:category', 'admin')); /** Создание привелегий */ $myAcl->allow('guest', 'user') ->deny('guest', 'article') ->allow('guest', 'article', 'view') ->allow(array('writer', 'admin'), 'article', array('add', 'edit')) ->allow('admin', 'admin'); /** Установка фронт-контроллера */ require_once 'Zend/Controller/Front.php'; $front = Zend_Controller_Front::getInstance(); $front->setControllerDirectory(array('default' => 'path/to/default/controllers', 'admin' => 'path/to/admin/controllers')); /** Регистрация объекта плагина */ require_once 'Zend/Controller/Plugin/Acl.php'; $front->registerPlugin(new Zend_Controller_Plugin_Acl($myAcl, 'guest')); /** Запуск диспетчеризации */ $front->dispatch(); |
2. Использование ролей
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | user controller class UserController extends Zend_Controller_Action { protected $_application; public function init() { require_once 'Zend/Session/Namespace.php'; $this->_application = new Zend_Session_Namespace('myApplication'); } public function loginAction() { ... Код проверки авторизации if ($valid) { /** Сохранение роли в сессии */ $this->_application->currentRole = $user->role; $this->_application->loggedUser = $user->username; } } public function logoutAction() { $this->_application->currentRole = 'guest'; $this->_application->loggedUser = null; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /** Загрузка данных приложения из сессии */ require_once 'Zend/Session/Namespace.php'; $application = new Zend_Session_Namespace('myApplication'); if (!isset($application->currentRole)) { $application->currentRole = 'guest'; } /** Установка фронт-контроллера */ require_once 'Zend/Controller/Front.php'; $front = Zend_Controller_Front::getInstance(); $front->setControllerDirectory('path/to/controllers'); /** Регистрация объекта плагина */ require_once 'Zend/Controller/Plugin/Acl.php'; $front->registerPlugin(new Zend_Controller_Plugin_Acl($myAcl, $application->currentRole)); /** Запуск диспетчеризации */ $front->dispatch(); |
3. Установка действия, отображаемого в случае запрета доступа
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /** Установка фронт-контроллера */ require_once 'Zend/Controller/Front.php'; $front = Zend_Controller_Front::getInstance(); $front->setControllerDirectory('path/to/controllers'); /** Установка действия, отображаемого в случае запрета доступа */ require_once 'Zend/Controller/Plugin/Acl.php'; $aclPlugin = new Zend_Controller_Plugin_Acl($myAcl, 'guest'); $aclPlugin->setErrorPage('goaway', 'my-error-controller', 'my-module'); /** Регистрация объекта плагина */ $front->registerPlugin($aclPlugin); /** Запуск диспетчеризации */ $front->dispatch(); |
4. Использование помощника действий
Итак, перво-наперво нам нужно зарегистрировать наш плагин фронт-контроллера и Controller Action Helper Broker.
Bootstrap-файл
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | /** Загрузка данных приложения из сессии */ require_once 'Zend/Session/Namespace.php'; $application = new Zend_Session_Namespace('myApplication'); if (!isset($application->loggedUser)) { $application->loggedUser = null; } /** Установка фронт-контроллера */ require_once 'Zend/Controller/Front.php'; $front = Zend_Controller_Front::getInstance(); $front->setControllerDirectory('path/to/controllers'); /** Регистрация объекта плагина */ require_once 'Zend/Controller/Plugin/Acl.php'; $front->registerPlugin(new Zend_Controller_Plugin_Acl($myAcl, $application->currentRole)); /** Регистрация объекта Action Helper */ require_once 'Zend/Controller/Action/Helper/Acl.php'; require_once 'Zend/Controller/Action/HelperBroker.php'; Zend_Controller_Action_HelperBroker::addHelper(new Zend_Controller_Action_Helper_Acl()); /** Запуск диспетчеризации */ $front->dispatch(); |
Контроллер Article
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | article controller class ArticleController extends Zend_Controller_Action { protected $_acl; protected $_application; public function init() { /** Получаем наш помощник действия (Action Helper) */ $this->_acl = $this->_helper->getHelper('acl'); require_once 'Zend/Session/Namespace.php'; $this->_application = new Zend_Session_Namespace('myApplication'); } ... public function editAction() { /** Получаем статью по id */ $article = new Article($this->_request->id); /** Проверяем, является ли пользователь владельцем или администратором */ if (($article->author != $this->_application->loggedUser) && ($this->_application->currentRole != 'admin')) { $this->_acl->denyAccess(); } ... } } |
Заключение
Zend_Acl & MVC IntegrationА здесь вы найдете исходный код примеров к данной статье:
Исходный код
Оригинал статьи на DevZone:
http://devzone.zend.com/article/3510-Zend_Acl-and-MVC-Integration-Part-II-Advanced-Use

Свежие комментарии