Взяв Zend_ACL в качестве примера, мне интересно, как это должно быть организовано для проекта. Конечно, пример хорош и аккуратен, но реальный сайт намного сложнее.
$acl = new Zend_Acl(); $acl->addRole(new Zend_Acl_Role('guest')); $acl->addRole(new Zend_Acl_Role('member')); $acl->addRole(new Zend_Acl_Role('admin')); $parents = array('guest', 'member', 'admin'); $acl->addRole(new Zend_Acl_Role('someUser'), $parents); $acl->add(new Zend_Acl_Resource('someResource')); $acl->deny('guest', 'someResource'); $acl->allow('member', 'someResource'); echo ($acl->isAllowed('guest', 'someResource') ? 'allowed' : 'denied');
Учитывая, что каждый контроллер / страница на моем сайте будет иметь какую-то проверку доступа, мне нужны правила, доступные во всем мире. Означает ли это, что мне нужно создать массивный файл конфигурации или класс для настройки всех правил загрузки? Разве это не потеряло бы много памяти?
Но если я только установил правила, необходимые для каждого контроллера, который бы превзошел цель ACL? Основная причина использования ACL заключается в том, чтобы избежать распространения разрешений по всей кодовой базе:
Admin_Controller { public function action() { if($user->role !== 'admin') { die('not allowed'); } } }
Как насчет изменений? Что делать, если правила ACL хранятся в базе данных, где администратор может легко изменять разрешения. Должны ли все они загружаться каждый запрос страницы? Разве это не положило бы большую нагрузку на систему?
Короче говоря, как ACL работает на большом сайте? Какие проблемы возникают? Как обрабатываются каскадные разрешения?
Вы можете хранить роли в базе данных и кэшировать объект в памяти с помощью memcache, так что вам нужно будет только запрашивать db при добавлении или изменении новых ролей. Что касается реализации ACL, так как он будет использоваться в рамках всей системы, вы можете инициализировать его в файле Bootstrap.php, а затем сохранить объект в Zend_Registry, чтобы он был доступен для всего вашего приложения.
Применение этих правил может происходить в разных точках. Вы можете использовать маршруты в настраиваемом маршрутизаторе или, возможно, на более высоком уровне на уровне контроллера. Если вы расширите Zend_Controller_Action, вы можете поместить свои правила ACL в этот главный контроллер, из которого выведен любой другой контроллер. Вы можете проверить разрешения ACL в методе _init (). Там могут быть другие точки в системе, в которых вам нужен ACL, или хотите проверить его, в зависимости от того, как и как вы его создаете (поэтому вы храните ACL в реестре).