Поисковая форма:) поиск по free-lance.ru Топ/история/обновления фриланса, по разным параметрам (темы, сообщения, пользователи...) Автоматическое удаление постов от ненужных юзеров в топике (php скрипт) Досье(точный ник)
 

Ник (или часть ника):
?
Какой текст ищем:
?
Раздел блогов:
За срок
дней
Тип поиска: (по вхождению: по тексту гуг выдаст посты с "гуг", "гугл", "огугл"; "полнотекстовый": по тексту "гуг" выдаст посты только с "гуг")
По вхождению строки:  Полнотекстовый: 
(поиск не 100% актуальный, есть определённая задержка при обновлении данных для поиска. )
0 Всего найдено: 2
cramen Сообщение 22/07/2010 08:40 Копия темы
Zend_ACL: Хранение в базе данных Рано или поздно все сталкиваются с проблемой контроля доступа и гибкостью управления этим контролем.

В Zend Framework есть замечательный компонент. Называется Zend_Acl.
И все вроде-бы хорошо. Нужные задачи он решает, но его конфигурирование стоит больших усилий, даже с использованием конфига и ресурслоадера.
Хотелось-бы переложить задачу его конфигурирования на отдельный класс, управляемый информацией из БД.   
Была создана структура БД, в которую укладывались все возможности, которые предоставляет Zend_Acl.

Дамп и схема этой БД находится в приложенных файлах. Так-же там находятся все необходимые для работы классы моделей.

Итак, сам код необходимого нам класса:

<?php
class Z_Acl extends Zend_Acl
{
      protected static $instance = null;

      public function __construct()
      {
            $resourcesModel = new Z_Model_Resources();
            $resources = $resourcesModel->fetchAll()->toArray();
            
            $resourceById = array();
            foreach ($resources as $resource)
             $resourceById[$resource['id']] = $resource['resourceId'];

            $res_added = false;
while(!$res_added)
{
            $res_added = true;
            foreach($resources as $resource)
            {
             $parentResourceId = array_key_exists($resource['parentid'],$resourceById)?$resourceById[$reso urce['parentid']]:NULL;
                  if ($parentResourceId==NULL || $this->has($parentResourceId))
                  {
                   if (!$this->has($resource['resourceId']))
                   $this->addResource($resource['resourceId'], $parentResourceId);
                  }
                  else
                  {
                   $res_added = false;
                  }
            }
}

            $rolesModel = new Z_Model_Roles();
            $roles = $rolesModel->fetchAll()->toArray();// !!!
            foreach($roles as $role)
            {
                  $this->addRoleParents($role);// !!!
                  if(!$this->_getRoleRegistry()->has($role['roleId']))
                  {
                        $this->addRole($role['roleId'], $rolesModel->getParentsArray($role['id']));
                  }
            }

            $privilegesModel = new Z_Model_Privileges();
            $rulesModel = new Z_Model_Rules();
            $rules = $rulesModel->getAllRules();
            foreach($rules as $rule)
            {
                  if(empty($rule['roleId']))
                  {
                        $rule['roleId'] = null;
                  }
                  if(empty($rule['resourceId']))
                  {
                   $rule['resourceId'] = null;
                  }

                  $privileges = $privilegesModel->getRulePrivileges($rule['id']);
                  foreach ($privileges as $privilege)
                  {
                  if(empty($privilege))
      {
      $privilege = null;
      }
      if('allow' === $rule['rule'])
                  {
                        $this->allow($rule['roleId'], $rule['resourceId'], $privilege);
                  }
                  elseif('deny' === $rule['rule'])
                  {
                        $this->deny($rule['roleId'], $rule['resourceId'], $privilege);
                  }
                  else
                  {
                        require_once' Zend/Acl/Exception.php';
                        throw new Zend_Acl_Exception("Unsupported rule type; must be either' "
                        . self::TYPE_ALLOW ." ' or' "
                        . self::TYPE_DENY ." '");
                  }
                  }
            }
      }

      /**
       *   
       * @param $role
       */
      public function addRoleParents($role)
      {
            $rolesModel = new Z_Model_Roles();
            $parents = $rolesModel->getParents($role['id']);
            foreach($parents as $parent)
            {
                  $this->addRoleParents($parent);
                  if(!$this->_getRoleRegistry()->has($parent['roleId']))
                  {
                        $this->addRole($parent['roleId'], $rolesModel->getParentsArray($parent['id']));
                  }
            }
      }

      /**
       * @return Z_Acl
       */
      public static function getInstance()
      {
            if(null === self::$instance)
            {
       $acl = new Z_Acl();
            }

            return self::$instance;
      }
}


Класс оформлен, как синглтон.
Достаточно подключиться к БД и получить экземпляр класса.
Класс наследуется от Zend_Acl, поэтому, как его использовать дальше, смотрите в документации к Zend_Acl.

В итоге мы получили класс, у которого можно узнать в любом месте нашего приложения, какая роль, куда и имеет-ли доступ.
Остается только написать админку дляуправления созданными таблицами в БД и вуаля: гибкая система контроля доступа у вас на сайте.
clockworkbird Сообщение 22/07/2010 10:29 Копия темы
Прикольно. Нравится подход.
0

©2008 edogs egods
Выразить восторг, поругаться
или предложить что-нибудь можно на форуме
Для обсуждения этого сервиса так же есть темы на фрилансе по
поиску , флудотопу ,и по удалённым сообщениям ,и по Актуальным/популярным темам , и по топу "кто кому больше наотвечал"