Как организовать и управлять ACL?

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


person Xeoncross    schedule 03.05.2011    source источник


Ответы (1)


Вы можете хранить роли в базе данных и кэшировать объект в памяти с помощью memcache, чтобы вам нужно было запрашивать базу данных только при добавлении или изменении новых ролей. Что касается реализации ACL, поскольку он будет использоваться во всей системе, вы можете инициализировать его в файле Bootstrap.php, а затем сохранить объект в Zend_Registry, чтобы он был доступен для всего вашего приложения.

Применение этих правил может происходить в различных точках. Вы можете захотеть применить маршруты в пользовательском маршрутизаторе или, возможно, на более высоком уровне на уровне контроллера. Если вы расширяете Zend_Controller_Action, вы можете поместить свои правила ACL в этот главный контроллер, от которого происходят все остальные контроллеры. Вы можете проверить разрешения ACL в методе _init(). В системе могут быть другие точки, где вам нужен ACL или вы хотите его проверить, в зависимости от того, что и как вы его строите (поэтому вы храните ACL в реестре).

person lucian303    schedule 04.05.2011