На сайте разработчиков Zend Framework еще в конце июня появилась статья об интеграции Zend_Acl и парадигмы MVC. Несмотря на полезность и актуальность информации, до сих пор я не встречал перевода этой статьи на русский язык. Ниже приведена моя попытка исправить это. Кроме того, я уже заканчиваю перевод продолжения этого материала, поэтому к понедельнику выложу и его.
Так что же не правильного в компоненте Zend_Acl и текущей реализации MVC в Zend Framework? Нет ничего неправильного, просто для разработчиков не вполне очевидно, как достичь оптимальной интеграции этих двух важнейших частей фреймворка.
Стоит отметить, что данная статья основана на текущих Предложениях к Zend Framework (ссылка), но в данный момент эти рекомендации находятся на утверждении. Окей! Как это работает? Для реализации этого в Предложениях существует два ключевых компонента:
- Плагин фронт-контроллера (Front Controller Plugin). Этот компонент проверяет, имеет ли текущий пользователь доступ к запрашиваемой странице.
- Помощник действий (Action Helper). Этот компонент позволяет делать проверку прав доступа пользователя внутри контроллера действий.
Давайте возьмем за основу эти два компонента, и попробуем воспользоваться ими на примере. В дальнейшем мы будем вести разговор о сайте на подобии DevZone. Нам будут необходимы один контроллер, который управляет администрированием пользователей, и второй – для управления статьями. Также нам нужны 3 типа пользователей (ролей): один для гостей, второй – для авторов, и еще один, с помощью которого мы будем утверждать статьи. Вот все что нам нужно:
Ресурсы:
- Контроллер user.
- Контроллер article.
Роли:
- Гость.
- Автор.
- Администратор.
Настройка компоненты Zend_Acl
После того, как мы определились со списком необходимых вещей, давайте создадим экземпляр Zend_Acl, который будет отражать нашу модель.
1 2 3 | /** Создание объекта ACL*/ require_once 'Zend/Acl.php'; $myAcl = new Zend_Acl(); |
Создание ролей
Теперь создадим роли в нашем экземпляре Zend_Acl.
1 2 3 4 5 | /** Создание ролей */ 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'); |
Создание ресурсов
Теперь мы можем создать необходимые ресурсы (по одному для каждого контроллера), чтобы потом определить их связь с созданными ранее ролями.
1 2 3 4 | /** Создание ресурсов */ require_once 'Zend/Acl/Resource.php'; $myAcl->add(new Zend_Acl_Resource('user')) ->add(new Zend_Acl_Resource('article')); |
Создание привилегий
После того, как мы добавили роли и ресурсы к экземпляру Zend_Acl, пришло время указать, какие действия будут доступны для каждой роли.
- Гости не имеют привелегий на редактирование, добавление и утверждение статей.
- Авторы не должны иметь доступ к утверждению статей.
- Администраторы должны иметь полный доступ.
1 2 3 4 5 6 | /** Создание привилегий */ $myAcl->allow('guest', 'user') ->deny('guest', 'article') ->allow('guest', 'article', 'view') ->allow('writer', 'article', array('add', 'edit')) ->allow('admin', 'article', 'approve'); |
Создание файла для отображения ошибки о запрете доступа
Мы должны создать скрипт вида и действие, которые будут обработаны в случае, если запрашиваемый адрес запрещен для пользователя. Для начала давайте создадим новое действие в нашем контроллере ошибок:
1 2 3 4 5 6 7 8 9 10 | class ErrorController extends Zend_Controller_Action { .... public function deniedAction() { } .... } |
А теперь, создайте новый скрипт вида (/application/views/scripts/error/denied.phtml) с каким-нибудь предупреждающим сообщением:
1 2 3 | <h1>Ошибка</h1> <h2>Доступ запрещен</h2> Вы запросили страницу, доступ к которой вам запрещен. |
Окончательная настройка
Окей! Мы настроили Zend_Acl, но до настоящего момента вы не узнали ничего нового. Наш следующий шаг – регистрация плагина контроллера. Это важный этап, который проверяет доступность запрашиваемой страницы для пользователя, используя созданный экземпляр Zend_Acl.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /** Установка фронт-контроллера */ 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); $aclPlugin->setRoleName($currentUserRole); $front->registerPlugin(new Zend_Controller_Plugin_Acl($acl, 'guest')); /** Запуск диспетчеризации */ $front->dispatch(); |
Настроив подобным образом ваше приложение, пользователю, обратившемуся к нему, в зависимости от назначенной ему роли, будет показана либо запрашиваемая страница, либо он будет перенаправлен на страницу с информацией о запрете доступа.
Автор статьи: Альдемар Берналь
Автор перевода: Кирилл Павлюков
Дополнительная информация:
Zend_Acl & MVC Integration
А здесь вы найдете исходный код примеров к данной статье:
Исходный код
Оригинал статьи на DevZone:
http://devzone.zend.com/article/3509-Zend_Acl-and-MVC-Integration-Part-I-Basic-Use
1 комментарий к “Интеграция Zend_Acl и MVC. Часть I (Базовое использование)”
-
1. пишет:
января 8, 2012 в 13:52
Decorating concepts for making your home atmosphere. News and creation trends from the world latest shows.
Оставьте комментарий или два
января 8, 2012 в 13:52
Decorating concepts for making your home atmosphere. News and creation trends from the world latest shows.

4 сентября 2008 в 11:33
[...] Интеграция Zend_Acl и MVC. Часть I (Базовое использование) [...]