Programmer's Reference Guide
| Введение |
Настройка управления доступом
Точное управление доступом
Базовый ACL, как было описано в предыдущем разделе, демонстрирует, как различные привилегии могут быть разрешены в ACL (ко всем ресурсам). Но на практике средства управления доступом имеют тенденцию к тому, чтобы иметь исключения из правил и различную степень сложности. Zend_Acl позволяет производить детализацию просто и гибко.
Для CMS из нашего примера было установлено, что хотя группа 'сотрудник' подходит большинству пользователей, возникла необходимость в новой группе 'маркетинг', которая имела бы доступ к подписке и последним новостям в CMS. Группа в некоторой степени самодостаточна и будет иметь возможность публиковать и удалять как подписки, так и последние новости.
Кроме этого, необходимо, чтобы группе 'сотрудник' было разрешено просматривать новости, но запрещено редактировать их. И наконец, должно быть запрещено всем (в том числе и администраторам) помещать в архив любые 'объявления', если с момента добавления прошло только 1-2 дня.
В первую очередь мы модифицируем реестр ролей для отражения этих изменений. Мы определили, что группа 'маркетинг' имеет те же базовые права, что и 'сотрудник', поэтому мы определим 'маркетинг' таким образом, чтобы она наследовала права группы 'сотрудник':
- // Новая группа 'маркетинг' наследует права от группы 'сотрудник'
- $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
Далее обратите внимание, что указанные выше права доступа имеют отношение к особым ресурсам (например, "подписка", "последние новости"). Теперь добавим эти ресурсы:
- // Создаем ресурсы для этих ролей
- // подписка
- $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.
- // Маркетинг должен иметь возможность публиковать и удалять подписку
- // и последние новости
- $acl->allow('marketing',
- // Пользователю (и маркетингу через наследование), запрещено редактировать
- // последние новости
- $acl->deny('staff', 'latest', 'revise');
- // Всем, включая администраторов, не разрешается удалять объявления
- $acl->deny(null, 'announcement', 'archive');
Теперь мы можем производить запросы к ACL с учетом последних изменений:
- "разрешен" : "запрещен";
- // запрещен
- "разрешен" : "запрещен";
- // разрешен
- "разрешен" : "запрещен";
- // запрещен
- "разрешен" : "запрещен";
- // разрешен
- "разрешен" : "запрещен";
- // разрешен
- "разрешен" : "запрещен";
- // запрещен
- "разрешен" : "запрещен";
- // запрещен
- "разрешен" : "запрещен";
- // запрещен
Удаление правил доступа
Для того, чтобы удалить одно или несколько правил из ACL, используйте методы removeAllow() или removeDeny(). Как и в случае с allow() и deny(), вы можете передавать NULL в качестве параметра, чтобы применить метод ко всем ролям, ресурсам, и/или привилегиям:
- // Убираем запрет на редактирование последних новостей для 'пользователя'
- // (и маркетинга через наследование)
- $acl->removeDeny('staff', 'latest', 'revise');
- "разрешен" : "запрещен";
- // разрешен
- // Убираем разрешение на публикацию и удаление подписки для маркетинга
- $acl->removeAllow('marketing',
- 'newsletter',
- "разрешен" : "запрещен";
- // запрещен
- "разрешен" : "запрещен";
- // запрещен
Привилегии могут модифицироваться в порядке возрастания, как показано выше, но параметр NULL для привилегий переопределяет такой порядок изменений:
- // Разрешить маркетингу все действия над последними новостями
- $acl->allow('marketing', 'latest');
- "разрешен" : "запрещен";
- // разрешен
- "разрешен" : "запрещен";
- // разрешен
- "разрешен" : "запрещен";
- // разрешен
| Введение |
Add A Comment
Please do not report issues via comments; use the ZF Issue Tracker.
If you have a JIRA/Crowd account, we suggest you login first before commenting.

Comments
$acl->allow('marketing',
array('newsletter', 'latest'),
array('publish', 'archive'));
Can the above statement be rewritten as
2.
$acl->allow('marketing','newsletter',array('publish', 'archive'));
$acl->allow('marketing','latest',array('publish', 'archive'));
I tested it. It didn't give any error but i'm asking this because does 2. will allocate more memory space then 1.?
Regards,
Shah Mubashir Hussain.
$acl->allow('marketing',
array('newsletter', 'latest'),
array('publish', 'archive'));
Can the above statement be rewritten as
2.
$acl->allow('marketing','newsletter',array('publish', 'archive'));
$acl->allow('marketing','latest',array('publish', 'archive'));
I tested it. It didn't give any error but i'm asking this because does 2. will allocate more memory space then 1.?
Regards,
Shah Mubashir Hussain.