Авг 29

На сайте разработчиков Zend Framework еще в конце июня появилась статья об интеграции Zend_Acl и парадигмы MVC. Несмотря на полезность и актуальность информации, до сих пор я не встречал перевода этой статьи на русский язык. Ниже приведена моя попытка исправить это. Кроме того, я уже заканчиваю перевод продолжения этого материала, поэтому к понедельнику выложу и его.

Так что же не правильного в компоненте Zend_Acl и текущей реализации MVC в Zend Framework? Нет ничего неправильного, просто для разработчиков не вполне очевидно, как достичь оптимальной интеграции этих двух важнейших частей фреймворка.

Стоит отметить, что данная статья основана на текущих Предложениях к Zend Framework (ссылка), но в данный момент эти рекомендации находятся на утверждении. Окей! Как это работает? Для реализации этого в Предложениях существует два ключевых компонента:

  1. Плагин фронт-контроллера (Front Controller Plugin). Этот компонент проверяет, имеет ли текущий пользователь доступ к запрашиваемой странице.
  2. Помощник действий (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

Share

Автор: Кирилл Павлюков \\ Метки: , , , , ,

  1. Интеграция Zend_Acl и MVC. Часть II (Продвинутое использование) | Кирилл Павлюков пишет:

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


1 комментарий к “Интеграция Zend_Acl и MVC. Часть I (Базовое использование)”

  1. 1. Ivo пишет:

    Decorating concepts for making your home atmosphere. News and creation trends from the world latest shows.

Оставьте комментарий или два