Coding Samples, Tutorials, Code Snippets, Articles, How-To`s - From Beginners to Expert. Stay tuned.
Share your knowledge. Regardless what experience you have made with the Zend Framework - Let all benefit.

Search Manual:

Please Sign in or Register

Available Languages

 


Manual for Zend Framework 1.0.3

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

2.2.1. Точное управление доступом

Базовый ACL, как было описано в предыдущем разделе, демонстрирует, как различные привилегии могут быть разрешены в ACL (ко всем ресурсам). Но на практике средства управления доступом имеют тенденцию к тому, чтобы иметь исключения из правил и различную степень сложности. Zend_Acl позволяет производить детализацию просто и гибко.

Для CMS из нашего примера было установлено, что хотя группа 'сотрудник' удовлетворяет нуждам большинства пользователей, но возникла необходимость в новой группе 'маркетинг', которая имеет доступ к подписке и последним новостям в CMS. Группа в некоторой степени самодостаточна и будет иметь возможность публиковать и удалять как подписки, так и последние новости.

Кроме этого, необходимо, чтобы группе 'сотрудник' было разрешено просматривать новости, но запрещено редактировать их. И наконец, должно быть запрещено всем (в том числе и администраторам) помещать в архив любые 'объявления', если с момента добавления прошло только 1-2 дня.

В первую очередь мы внесем изменение в реестр ролей для отражения этих изменений. Мы определили, что группа 'маркетинг' имеет те же базовые права, что и 'сотрудник', поэтому мы определим 'маркетинг' таким образом, чтобы она наследовала права группы 'сотрудник':

<?php
// Новая группа 'маркетинг' наследует права от группы 'сотрудник'
$acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
        

Далее, обратите внимание, что указанные выше права доступа имеют отношение к особым ресурсам (например, "подписка", "последние новости"). Теперь мы добавим эти ресурсы:

<?php
// Создаем ресурсы для этих ролей
require_once 'Zend/Acl/Resource.php';
$acl->add(new Zend_Acl_Resource('newsletter'));           // подписка
$acl->add(new Zend_Acl_Resource('news'));                 // новости
$acl->add(new Zend_Acl_Resource('latest'), 'news');       // последние новости
$acl->add(new Zend_Acl_Resource('announcement'), 'news'); // объявления
        

Затем определяются более точные правила для целевых областей ACL.

<?php
// Маркетинг должен иметь возможность публиковать и удалять подписку и последние новости
$acl->allow('marketing', array('newsletter', 'latest'), array('publish', 'archive'));

// Пользователю (и маркетингу, через наследование), запрещено редактировать последние новости
$acl->deny('staff', 'latest', 'revise');

// Всем, включая администраторов, запрещено удалять объявления
$acl->deny(null, 'announcement', 'archive');
        

Теперь мы можем производить запросы к ACL с учетом последних изменений:

<?php
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 (запрещен)
        

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

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

<?php
// Удаляем запрет на редактирование последних новостей для 'пользователя' (и маркетинга, через наследование)
$acl->removeDeny('staff', 'latest', 'revise');

echo $acl->isAllowed('marketing', 'latest', 'revise') ?
     "allowed" : "denied"; // allowed (разрешен)

// Удаляем разрешение на публикацию и удаление подписки для маркетинга
$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 для привилегий переопределяет такой порядок изменений:

<?php
// Разрешить маркетингу все для действий над последними новостями
$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 (разрешен)
        

Welcome!

Welcome to ZFResource - The Resource for the Zend Framework.
As you see, the website is in still in progress. Many features ( like Code Directory, Code Samples, User written Tutorials, Examples and News,...) will be online in near future.
At the moment, you can search and browse the manual in your language of choice. Don't forget to come back later to benefit from the new features.


Help Wanted:

We are still searching for people want to help building this site. If you want to see this website in your language or you have any suggestions for this site please send us an email