![]() |
0 Всего найдено: 2
cramen
Сообщение
22/07/2010 08:40
Копия темы
0
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. В итоге мы получили класс, у которого можно узнать в любом месте нашего приложения, какая роль, куда и имеет-ли доступ. Остается только написать админку дляуправления созданными таблицами в БД и вуаля: гибкая система контроля доступа у вас на сайте. |
Выразить восторг, поругаться или предложить что-нибудь можно на форуме |
Для обсуждения этого сервиса так же есть темы на фрилансе по поиску , флудотопу ,и по удалённым сообщениям ,и по Актуальным/популярным темам , и по топу "кто кому больше наотвечал" |