Содержание


Настройка управления доступом


Precise Access Controls, ACL, ЗФ2, Zend Framework 2, ZF2, ру, ru




Точный контроль доступа

 

Основы ACL, показанные в предыдущей главе показывали, как различные привилегии могут применяться ко все ACL (всем ресурсам). Однако на практике контроль доступа изобилует различными исключениями и степенями сложности. Zend\Permissions\Acl\Acl позволяет достигнуть всего этого, благодаря своей простоте и гибкости.

 

На примере нашей CMS: в то время, как группа «staff» обеспечивает все необходимое для постоянны пользователей, возможно понадобится группа «marketing», которая будет предоставлять информацию о последних новостях и письмах. Эта группа достаточно самостоятельна и сможет сама публиковать и архивировать как последние новости так и письма.

 

Так же, группа «staff» должна иметь доступ к просмотру новостей, но не видеть последние новости. Так же, никто, даже администраторы не должны иметь право отправлять в архив последние новости, пока они не провесят минимум 1-2 дня.

 

Сначала пересмотрим реестр ролей для внесения данных изменений. Мы определили, что группа «marketing» будет иметь те же базовые права, что и группа «staff». Тоесть определим группу «staff» как родителя.  

// The new marketing group inherits permissions from staff
use Zend\Permissions\Acl\Acl;
use Zend\Permissions\Acl\RoleGenericRole as Role;
use Zend\Permissions\Acl\ResourceGenericResource as Resource;
 
$acl = new Acl();
 
$acl->addRole(new Role('marketing'), 'staff');

Отметим, что выше описанный контроль доступа относится к конкретным ресурсам («newsletter», «latest news», «announcement news»). Добавим эти ресурсы:

// Create Resources for the rules
 
// newsletter
$acl->addResource(new Resource('newsletter'));
 
// news
$acl->addResource(new Resource('news'));
 
// latest news
$acl->addResource(new Resource('latest'), 'news');
 
// announcement news
$acl->addResource(new Resource('announcement'), 'news');

Теперь нужно определить эти конкретные правила на целевую арену ACL:

// Marketing must be able to publish and archive newsletters and the
// latest news
$acl->allow('marketing',
            array('newsletter', 'latest'),
            array('publish', 'archive'));
 
// Staff (and marketing, by inheritance), are denied permission to
// revise the latest news
$acl->deny('staff', 'latest', 'revise');
 
// Everyone (including administrators) are denied permission to
// archive news announcements
$acl->deny(null, 'announcement', 'archive');

Теперь можем обращаться к ACL с учетом нового функционала:

echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
     "allowed" : "denied";
// denied
 
echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
     "allowed" : "denied";
// allowed
 
echo $acl->isAllowed('staff', 'latest', 'publish') ?
     "allowed" : "denied";
// denied
 
echo $acl->isAllowed('marketing', 'latest', 'publish') ?
     "allowed" : "denied";
// allowed
 
echo $acl->isAllowed('marketing', 'latest', 'archive') ?
     "allowed" : "denied";
// allowed
 
echo $acl->isAllowed('marketing', 'latest', 'revise') ?
     "allowed" : "denied";
// denied
 
echo $acl->isAllowed('editor', 'announcement', 'archive') ?
     "allowed" : "denied";
// denied
 
echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
     "allowed" : "denied";
// denied

Удаление правил доступа

 

Для удаления одного или нескольких правил доступа из ACL, просто используйте метод «removeAllow()» или «removeDeny()». Как и в методах «allow()» и «deny(» Вы можете использовать значение «NULL» для применения правил  сразу ко всем ролям, ресурсам, привилегиям:

// Remove the denial of revising latest news to staff (and marketing,
// by inheritance)
$acl->removeDeny('staff', 'latest', 'revise');
 
echo $acl->isAllowed('marketing', 'latest', 'revise') ?
     "allowed" : "denied";
// allowed
 
// Remove the allowance of publishing and archiving newsletters to
// marketing
$acl->removeAllow('marketing',
                  'newsletter',
                  array('publish', 'archive'));
 
echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
     "allowed" : "denied";
// denied
 
echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
     "allowed" : "denied";
// denied

Привилегии могут изменятся постепенно, как в примере выше, но применение значения «NULL» переопределит такие изменения:

// Allow marketing all permissions upon the latest news
$acl->allow('marketing', 'latest');
 
echo $acl->isAllowed('marketing', 'latest', 'publish') ?
     "allowed" : "denied";
// allowed
 
echo $acl->isAllowed('marketing', 'latest', 'archive') ?
     "allowed" : "denied";
// allowed
 
echo $acl->isAllowed('marketing', 'latest', 'anything') ?
     "allowed" : "denied";
// allowed

Автор статьи: DuB