Я недавно прошел весь процесс ACL и доволен результатом.Вот что я реализовал:
Расширьте Zend_ACL
и используйте его конструктор для добавления ваших ролей (включая отношения наследования).
Создание действияпомощник, который загружается в загрузчик.(Вам нужно загрузить его заранее, чтобы вы могли использовать его перехватчики, такие как preDispatch
).
Отредактируйте init()
каждого контроллера, который вы хотите защитить, и вызовитеновый помощник ACL, передавая правила, которые вы хотите применить к этому контроллеру, например: allow('member', 'edit);
Реальная работа выполняется помощником действий.Он имеет четыре функции:
init()
- создает новый класс ACL, а затем добавляет новый ресурс, который отражает имя текущего контроллера,то есть.$this->_resource = $this->getRequest()->getControllerName())
.
preDispatch()
- получает текущий тип пользователя с помощью Zend_Auth
(или назначает гостя по умолчанию, когда пользователь не вошел в систему).Проверяет, разрешен ли запрос с использованием ACL,то есть $this->_acl->isAllowed($currentRole, $resource, $action)
. Обратите внимание , что запрошенное действие становится привилегией ACL.
allow()
- Это просто прокси до функции allow()
объекта ACL.Он вызывается конструктором контроллера для установки правил в ACL.
deny()
- как для разрешения.
Итак, во время выполненияпоследовательность событий выглядит следующим образом:
помощник действий загружен в загрузчик.Это a) создает экземпляр пользовательского объекта ACL, который устанавливает свои собственные роли, затем b) добавляет текущее имя контроллера в качестве ресурса.
Controllers init()
выполняется.Он вызывает методы помощника allow()
и deny()
для установки правил.
Запуск помощника preDispatch()
, и если !isAllowed()
, пользователь перенаправляется.
Я выполнял аутентификацию на БД, но та же логика применима, если вы используете LDAP
.(Является ли базовая аутентификационная подсказка Apache проблемой по умолчанию в этом случае? Если нет, то это может добавить дополнительные сложности).
Я адаптировал это из книги Роба Аллена (Zend Framework in Action) и других различныхисточники.Обратите внимание, что некоторые профессионалы Zend рекомендуют ACL на основе моделей (не действий контроллера).Я тоже немного подумаю над этим.
Один особенно удобный аспект вышеупомянутого подхода заключается в том, что действительно легко поддерживать правила ACL на постоянной основе.Пока вы работаете с конкретным контроллером, вы устанавливаете его ACL
правила в init()
.