Zend Framework: Можете ли вы сделать ACL без каталога плагинов? - PullRequest
3 голосов
/ 19 июля 2011

У меня проблемы с пониманием правил ACL в ZF, и документы не ясны. Я использую общую библиотеку Zend для всех сайтов. Пока проблем нет, но теперь каждая демонстрация или пример говорит, что вы должны поместить класс ACL (acl.php) в каталог библиотеки как плагин. Zend / Library / My / Controller / Plugin /.

Я не хочу этого делать, потому что это противоречит цели совместного использования общего каталога инфраструктуры.

Кто-нибудь делал или имеет какие-либо идеи о том, как выполнить ACL, используя отдельные файлы классов acl.php для каждого веб-сайта / веб-приложения?

Спасибо

Ответы [ 3 ]

1 голос
/ 19 июля 2011

Вам не нужно размещать acl.php в каталоге библиотек как плагин.Автозагрузчик отлично загрузит класс, трюк с Zend_Acl просто заправляет экземпляр класса вашими ролями и ресурсами.

Прошло немного времени с тех пор, как я коснулся Zend Framwork, но я постараюсь управлятьвы в правильном направлении.

  1. В вашей начальной загрузке создайте объект Zend_Acl

    $ acl = new Zend_Acl ();// см. документацию о том, как добавить роли и ресурсы

  2. Теперь создайте папку Plugin внутри вашей директории Controller, это позволит вам аутентифицироваться с вашим acl.

  3. Внутри него создайте новый класс, который расширяет Zend_Controller_Plugin_Abstract и дает ему правильное имя класса, которое будет выбрано автозагрузчиком.

  4. Сохраните все ваши данныесоздайте в реестре и в своем плагине переопределите метод preDispatch, отсюда у вас есть доступ к запросу и acl (из реестра zend), который вы можете проверить по мере необходимости.(Некоторые люди используют контроллер / действие в качестве ресурсов других моделей. Это довольно свободная форма.

  5. Зарегистрируйте ваш плагин с помощью фронт-контроллера.

    $ frontController-> registerPlugin (new My_Controller_Plugin_Acl());

Это, вероятно, то, что предлагают другие учебные пособия (или варианты этого), иногда это может быть немного запутанным.

1 голос
/ 19 июля 2011

В конечном итоге вы можете разместить его в любом месте, если ваш автозагрузчик достаточно настроен для его поиска. И как именно вы его используете, зависит от того, какие ресурсы и привилегии вы пытаетесь защитить.

Но подумайте, что вы путаете создание своего ACL и запросы к ACL.

Скорее всего, вы будете создавать / заполнять свой объект ACL во время начальной загрузки и сохранять его в реестре Bootstrap или в синглтоне Zend_Registry.

Если ваши ресурсы являются контроллерами, а ваши привилегии - действиями, то обычно перехватывается цикл отправки с помощью плагина preDispatch(), который запрашивает ваш объект ACL.

Итак, мы действительно смотрим на два разных класса / объекта:

  1. Одним из них является сам ACL, расширяющий Zend_Acl. Этот может быть назван Application_Model_Acl и помещен в файл application/models/Acl.php.

  2. Другой - плагин фронт-контроллера. Этот может быть назван Application_Plugin_Acl и сохранен в файле application/plugins/Acl.php

[Обратите внимание, что оба они предполагают, что мы используем пространство имен приложения Application. Также обратите внимание, что оба они относятся к конкретному проекту.]

Конечно, описанному плагину нужно предоставить объект ACL, чтобы он мог выполнять свою работу, поэтому у вашей Bootstrap может быть такой метод:

protected _initAclPlugin()
{
    $acl = new Application_Model_Acl();
    $plugin = new Application_Plugin_Acl($acl);
    Zend_Controller_Front::getInstance()->registerPlugin($plugin);
}

Но помните, это единственный способ использовать ваш ACL. В некоторых случаях ваш ACL может не ограничиваться только контроллерами / действиями. В этом случае вам может потребоваться передать ваш объект ACL другим моделям / службам, которые также запрашивают его. В этом случае в вашем Bootstrap может быть отдельный метод для создания объекта ACL и его сохранения в реестре Bootstrap. Тогда ваши контроллеры - или даже система внедрения зависимостей - могут взять их оттуда и передать всем, что может понадобиться последующим моделям / сервисам.

[Вы знаете, глядя на мой ответ, он не очень отличается от ответа @linead. Та же самая идея, разные слова, но он полностью вошел первым.]

1 голос
/ 19 июля 2011

Вы никогда не должны добавлять файлы в каталог библиотеки Zend - есть ли у вас ссылки на учебники, рекомендующие это?Файлы должны находиться в каталоге библиотеки в пространстве имен вашего приложения, давая вам такую ​​структуру, как:

application/
library/
    Zend/
        (ZF files)
    Foo/
        Controller/
            Plugin/
                ...

или в application/plugins, application/controller/helpers или где-то еще, в зависимости от подхода, который вы выбираете.

Редактировать : похоже, что плагин контроллера - это то, что рекомендует учебник, и в этом случае вы захотите класс, подобный Yourapp_Plugin_Acl (замените 'Yourapp' пространством имен вашего приложения), которыйбудет жить в application/plugins/Acl.php.

...