Динамические Роли И Права

Недавно мне довелось написать динамическую систему ролей и прав для интернет-магазина.

Потому что в Интернете вам больше ничего не нужно, кроме Вот этот Цикл статей найти не удалось, поэтому решил написать все сам.

Итак, давайте начнем.



База

Информацию о ролях, ресурсах и правах доступа мы будем хранить в базе данных.

База данных имеет примерно следующую структуру: acl_resources — ресурсы acl_roles — группы имен пользователей, они же роли acl_cross — пересечение ролевых и ресурсных соответствий: идентификатор/идентификатор_роли/res_id 1 1 1 2 1 2 3 1 3 * Для роли с id=1 доступны ресурсы 1,2,3.

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

В файле контроля доступа напишем следующий код: класс Acl расширяет Zend_Acl { публичная функция __construct() { $модель = новый пользователь(); /** * добавить ресурсы */ // получаем ресурсы $resources = $model-> getResources(); foreach($resources как $mod) { // если такой ресурс еще не добавлен if(false == $this-> has($mod['module'].

'_'.

$mod['controller'])) { // добавлять $this-> add(new Zend_Acl_Resource($mod['module'].

'_'.

$mod['controller'])); } } /** * добавить роли пользователей * и немедленно дайте им разрешения */ // получаем роли $roles = $model-> getRoles(); // для каждой роли foreach($roles как $role) { // добавлять $this-> addRole(new Zend_Acl_Role($role['name'])); // получаем ресурсы, доступные для этой роли $permissions = $model-> getRoleResources($role['id']); // устанавливаем разрешения для этих ресурсов foreach($permissions как $perm) { $this-> allow($role['name'], $perm['модуль'].

'_'.

$perm['контроллер'], $perm['действие']); } } } } Таким образом мы обрабатываем записи из базы данных и создаём, по сути, ACL.

Плагин

Далее передаем управление плагину.

Плагин будет обрабатывать разрешения на уровне контроллера.

Ну это, например, если обычный пользователь скопировал ссылку модератора на действие по удалению товара - чтобы его не пустили.

Вот пример кода: класс Lord_Plugin_Acl расширяет Zend_Controller_Plugin_Abstract { частный $_acl = ноль; публичная функция __construct(Zend_Acl $acl) { $this-> _acl = $acl; } публичная функция preDispatch(Zend_Controller_Request_Abstract $request) { // Получаем объект Zend_Layout $layout = Zend_Layout::getMvcInstance(); // Получаем объект формы $view = $layout-> getView(); $auth = Zend_Auth::getInstance(); // если в хранилище сеанса есть пользователь если ($auth-> hasIdentity() == true) { // получаем данные этого пользователя $user = $auth-> getIdentity(); $userModel = новый пользователь(); $role = $userModel-> getRole($user-> role); $user-> roleName = $role-> name; } еще { $user-> roleName = 'анон'; } // добавляем переменную представления для отображения $view-> user = $user; /*--------------------------------------------------------------*/ $request = $this-> getRequest(); $controller = $request-> getControllerName(); $module = $request-> getModuleName(); $action = $request-> getActionName(); $acl = новый Acl(); $isAllow = $acl-> isAllowed($user-> roleName, $module.'_'.

$controller, $action); если ($isAllow == ложь) { $request-> setModuleName('пользователь') -> setControllerName('логин') -> setActionName('индекс'); } $view-> acl = $acl; /*--------------------------------------------------------------*/ } }

ViewHelper

Теперь нам нужно скрыть и показать элементы управления на уровне представления приложения.

Для этого напишем хелпер, который будет проверять права доступа и показывать или не показывать элемент управления: класс Lord_View_Helper_Acl { публичная функция Acl($module = 'default', $контроллер = 'индекс', $действие = 'индекс') { // Получаем объект Zend_Layout $layout = Zend_Layout::getMvcInstance(); // Получаем объект формы $view = $layout-> getView(); $acl = новый Acl(); $isAllow = $acl-> isAllowed($view-> user-> roleName, $module.'_'.

$controller, $action); если ($isAllow == ложь) { вернуть ложь; } еще вернуть истину; } } После написания помощника в скрипте представления нам просто нужно написать такой код, чтобы скрыть или показать элемент управления: В результате мы имеем систему, которая из веб-интерфейса может назначать права любой группе на любой модуль/контроллер/действие.

Некоторый код для скачивания: — База Плагин ViewHelper список управления доступом Теги: #zend #zend_acl #Zend Framework #Zend Framework

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.