Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правила Zend_Acl в БД 
:(
    Опции темы
Resident
  Дата 13.10.2008, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 25.9.2006

Репутация: нет
Всего: 0



Доброго времени суток! Помогите, пожалуйста, кто разбирается в проектировании баз данных. Решил написать сайтик с использованием Zend Framework, но столкнулся с проблемой динамического управления правилами Zend_Acl. Собственно хочу хранить их (правила) в БД, но чет никак не могу понять как именно их нужно там хранить. Есть Ресурсы и Роли.

Ресурсы - это: МодулиКонтроллерыДействия (контроллеров);
Роли - это: Группы пользователейпользователи;

Права доступа определяются следующим образом:

Создаётся ресурс модуля (не от кого не наследуется), далее создаются ресурсы контроллеров данного модуля (каждый ресурс контроллера наследуется от своего модуля) и соответственно создаются ресурсы действий контроллеров (каждый ресурс действия наследуется от своего контроллера). И так для каждого модуля. На этом создание ресурсов заканчивается.

Далее создаются роли. Сначала создаются роли групп пользователей (не от кого не наследуются), после этого создаются роли пользователей (каждая роль пользователя наследуется от своей группы/групп).

Пользователь может быть как в одной группе, так и в нескольких одновременно (множественное наследование ролей).

Затем создаются правила ACL. Для каждой группы пользователей и для каждого пользователя задаются права доступа и типы доступа ко всем ресурсам.

Вот набросок кода как это примерно должно работать:

Код

require_once 'Zend/Acl.php';
require_once 'Zend/Acl/Role.php';
require_once 'Zend/Acl/Resource.php';

// Объект Zend_Acl
$acl = new Zend_Acl();

// Добавление групп пользователей
$acl->addRole(new Zend_Acl_Role('usergroups::admins'))
    ->addRole(new Zend_Acl_Role('usergroups::members'));

// Добавление пользователей
$acl->addRole(new Zend_Acl_Role('guest'))
    // Наследование от 2х групп
    ->addRole(new Zend_Acl_Role('member'), array('usergroups::admins', 'usergroups::members' ))
    ->addRole(new Zend_Acl_Role('admin'));

// Добавление ресурсов
// defaultModule
$acl->add(new Zend_Acl_Resource('defaultModule'));
// userController
$acl->add(new Zend_Acl_Resource('defaultModule::userController'), 'defaultModule');
$acl->add(new Zend_Acl_Resource('defaultModule::userController::registerAction'), 'defaultModule::userController');
$acl->add(new Zend_Acl_Resource('defaultModule::userController::loginAction')   , 'defaultModule::userController');
$acl->add(new Zend_Acl_Resource('defaultModule::userController::logoutAction')  , 'defaultModule::userController');
// newsController
$acl->add(new Zend_Acl_Resource('defaultModule::newsController'), 'defaultModule');
$acl->add(new Zend_Acl_Resource('defaultModule::newsController::addAction')     , 'defaultModule::newsController');
$acl->add(new Zend_Acl_Resource('defaultModule::newsController::showAction')    , 'defaultModule::newsController');
$acl->add(new Zend_Acl_Resource('defaultModule::newsController::updateAction')  , 'defaultModule::newsController');
$acl->add(new Zend_Acl_Resource('defaultModule::newsController::deleteAction')  , 'defaultModule::newsController');

// Установка прав доступа к ресурсам
// Разрешаем доступ ко всему модулю группе members
$acl->allow('usergroups::members', 'defaultModule');
// Запрещаем доступ к контроллеру newsController пользователю member
$acl->deny('member', 'defaultModule::newsController');
// Разрешаем доступ на просмотр действия show, контроллера news, модуля default
$acl->allow('member', 'defaultModule::newsController::showAction', 'view');

// Проверка прав доступа
echo 'member -> defaultModule = '                             , $acl->isAllowed('member', 'defaultModule')                             ? 'allowed' : 'denied', '<br />';
echo 'member -> defaultModule::newsController = '             , $acl->isAllowed('member', 'defaultModule::newsController')             ? 'allowed' : 'denied', '<br />';
echo 'member -> defaultModule::newsController::showAction = ' , $acl->isAllowed('member', 'defaultModule::newsController::showAction') ? 'allowed' : 'denied', '<br />';
echo 'member -> defaultModule::newsController::showAction (access type "view") = ' , $acl->isAllowed('member', 'defaultModule::newsController::showAction', 'view') ? 'allowed' : 'denied', '<br />';


Вывод будет следующим:

member -> defaultModule = allowed
member -> defaultModule::newsController = denied
member -> defaultModule::newsController::showAction = denied
member -> defaultModule::newsController::showAction (access type "view") = allowed


Думаю понятно почему вывод получился именно таким.
Так это должно работать в самом коде, но не редактировать же php файлы для того, чтобы поправить права доступа для группы или пользователя. smile 
А вот как запихнуть такое в БД незнаю. Я так понимаю тут должно быть много связанных таблиц, но что, как хз.

PS: Привелегий (типа access type "view") может быть тоже много, они не определены заранее. Т.е. в админке можно будет создавать новые привелегии типа: add, delete, update и т.д.

Сейчас для меня это проблема №1 и как ее можно решить даже представить себе не могу. У кого есть опыт работы с такими деревьями в БД очень прошу помочь. smile

Да совсем забыл сказать про СУРБД, используется MySQL5+.

Модераторы переместите тему в PHP: Базы Данных.

Это сообщение отредактировал(а) Resident - 13.10.2008, 01:21
PM   Вверх
sTa1kEr
Дата 13.10.2008, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 9
Всего: 146



Цитата(Resident @  13.10.2008,  01:58 Найти цитируемый пост)
Я так понимаю тут должно быть много связанных таблиц

Да именно так, но ничего сложного в этом нет, не надо боятся связанных таблиц. 

1. Возьмите листок бумаги и нарисуйте на нем все сущности: роль, группа, пользователь, etc. Если же сущностей может быть неограниченное количество, то отдельная таблица сущностей.
2. Затем определите какие связи между ними: 
  а. У одного пользователя может быть только одна группа и у одной группы может быть сколько угодно пользователей - связь один ко многим, колонка id группы у пользователей.
  б. У одной группы может быть много ролей, а у одной роли много групп, следовательно связь много ко многим - relationship-таблица с двумя колонками, id группы и id роли.
  в. ...
3. Определите колонки и составляйте сами таблицы.

Так же можете посмотреть реализацию phpgacl (в частности админку), или просто воспользоватся ею(что бы не изобретать велосипед) вместо/совместно c Zend-овским acl-ом.
PM MAIL   Вверх
ST_Falcon
Дата 17.11.2008, 02:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 14.11.2003
Где: Львов

Репутация: нет
Всего: 1



Посмотрите статью Zend_Acl and storing roles and resources in a DB
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0723 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.