Как организовать и управлять ACL? - PullRequest
2 голосов
/ 03 мая 2011

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

1 Ответ

1 голос
/ 04 мая 2011

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

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

...