Взяв в качестве примера 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 работает на большом сайте? Какие проблемы возникают? Как обрабатываются каскадные разрешения?