Недавно мне довелось написать динамическую систему ролей и прав для интернет-магазина.
Потому что в Интернете вам больше ничего не нужно, кроме Вот этот Цикл статей найти не удалось, поэтому решил написать все сам.
Итак, давайте начнем.
База
Информацию о ролях, ресурсах и правах доступа мы будем хранить в базе данных.
База данных имеет примерно следующую структуру:
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
-
Хуфт, Жерард
19 Oct, 24 -
Завершен Перевод Книги "Pro Git"
19 Oct, 24 -
Умный Дом. Опыт Разработки И Внедрения
19 Oct, 24 -
Полиморфная Куайна
19 Oct, 24 -
Ms-Dos – Нет Проблем! (Видео)
19 Oct, 24