Введение в Zend Framework

 Learning Zend Framework

appendix

 Zend Framework Reference


  • Zend_Gdata
  • Zend_Http
  • Zend_InfoCard
  • Zend_Json
  • Zend_Layout
  • Zend_Ldap
  • Zend_Loader
  • Zend_Locale
  • Zend_Log
  • Zend_Mail
  • Zend_Markup
  • Zend_Measure
  • Zend_Memory
  • Zend_Mime
  • Zend_Navigation
  • Zend_Oauth
  • Zend_OpenId
  • Zend_Paginator
  • Zend_Pdf
  • Zend_ProgressBar
  • Zend_Queue
  • Zend_Reflection
  • Zend_Registry
  • Zend_Rest

  • Zend_Search_Lucene
  • Zend_Serializer
  • Zend_Server
  • Zend_Service
  • Zend_Session
  • Zend_Soap
  • Zend_Tag
  • Zend_Test
  • Zend_Text
  • Zend_TimeSync
  • Zend_Tool
  • Zend_Tool_Framework
  • Zend_Tool_Project
  • Zend_Translate
  • Zend_Uri
  • Zend_Validate
  • Zend_Version
  • Zend_View
  • Zend_Wildfire
  • Zend_XmlRpc
  • ZendX_Console_Process_Unix
  • ZendX_JQuery
  • Ttranslation 27.4% Update 2010-11-28 - Revision 23238 - Version ZF 1.11.x

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

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

    Базовый 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',
                array(
    'newsletter''latest'),
                array(
    'publish''archive'));

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

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

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

    echo $acl->isAllowed('staff''newsletter''publish') ?
         
    "разрешен" "запрещен";
    // запрещен

    echo $acl->isAllowed('marketing''newsletter''publish') ?
         
    "разрешен" "запрещен";
    // разрешен

    echo $acl->isAllowed('staff''latest''publish') ?
         
    "разрешен" "запрещен";
    // запрещен

    echo $acl->isAllowed('marketing''latest''publish') ?
         
    "разрешен" "запрещен";
    // разрешен

    echo $acl->isAllowed('marketing''latest''archive') ?
         
    "разрешен" "запрещен";
    // разрешен

    echo $acl->isAllowed('marketing''latest''revise') ?
         
    "разрешен" "запрещен";
    // запрещен

    echo $acl->isAllowed('editor''announcement''archive') ?
         
    "разрешен" "запрещен";
    // запрещен

    echo $acl->isAllowed('administrator''announcement''archive') ?
         
    "разрешен" "запрещен";
    // запрещен

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

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

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

    echo 
    $acl->isAllowed('marketing''latest''revise') ?
         
    "разрешен" "запрещен";
    // разрешен

    // Убираем разрешение на публикацию и удаление подписки для маркетинга
    $acl->removeAllow('marketing',
                      
    'newsletter',
                      array(
    'publish''archive'));

    echo 
    $acl->isAllowed('marketing''newsletter''publish') ?
         
    "разрешен" "запрещен";
    // запрещен

    echo $acl->isAllowed('marketing''newsletter''archive') ?
         
    "разрешен" "запрещен";
    // запрещен

    Привилегии могут модифицироваться в порядке возрастания, как показано выше, но параметр NULL для привилегий переопределяет такой порядок изменений:

    // Разрешить маркетингу все действия над последними новостями
    $acl->allow('marketing''latest');

    echo 
    $acl->isAllowed('marketing''latest''publish') ?
         
    "разрешен" "запрещен";
    // разрешен

    echo $acl->isAllowed('marketing''latest''archive') ?
         
    "разрешен" "запрещен";
    // разрешен

    echo $acl->isAllowed('marketing''latest''anything') ?
         
    "разрешен" "запрещен";
    // разрешен
    digg delicious meneame google twitter technorati facebook

    Comments

    Loading...