Проэктирование БД

  • Автор темы Автор темы LONGMAN
  • Дата начала Дата начала
Таблица групп: ид, имя
Таблица ролей: ид, имя
Связка групп и ролей: ид_группы, ид_роли

+ моск + google / "Управление доступом на основе ролей"
 
На пример юзеру User хочу дать модера в форуме (скажем в раздел под id=5) и админа в чате, что делать? нужно создать такую группу у которых будет эти права?
Просто я впервые пишу свой движок и хочу понять суть работы системы "Управление доступом на основе ролей" на примерах. А в гугле я не нашёл практические примеры..
 
Роли - это вроде следующих: "Разрешено заходить в админчасть", "Разрешено редактировать новости", "Разрешено оставлять комментарии", "Разрешено удалять свои комментарии", "Разрешено удалять любые комментарии", "Разрешено входить в модераторский раздел", "Запрещено вставлять картинки" и т.д.

Примеры групп: "Администраторы", "Гости", "Активисты", "Модераторы".

Группе "Администраторы" можно назначить следующие роли: "Разрешено заходить в админчасть", "Разрешено редактировать новости", "Разрешено оставлять комментарии", "Разрешено удалять свои комментарии", "Разрешено удалять любые комментарии", "Разрешено входить в модераторский раздел".

Группе "Гости" можно назначить следующие роли: "Разрешено оставлять комментарии", "Запрещено вставлять картинки".

Группе "Активисты" можно назначить следующие роли: "Разрешено оставлять комментарии", "Разрешено удалять свои комментарии".

Группе "Модераторы" можно назначить следующие роли: "Разрешено оставлять комментарии", "Разрешено удалять свои комментарии", "Разрешено удалять любые комментарии", "Разрешено входить в модераторский раздел".

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

Если система прав очень сложна, то можно еще ввести наследование групп и/или ролей. Хотя я еще никогда не сталкивался с такой необходимостью.

Далее. Можно создать роль: "Разрешено модерировать форум с id=8". Но в описанную мной структуру таблиц ее не уложешь (нет смысла создавать особую группу модераторов для каждого форума). Отслеживание таких ролей следует поручать скрипту, в котором реализуешь модерацию.

Чтобы это стало возможным, твой класс для управления доступом должен быть достаточно гибким. Пример такого класса: Zend_Acl. Могу также дать свою реализацию. Но лучше тебе помучиться и написать свою. Иначе будет очень трудно понять, как с этим работать.
 
Если честно, итак трудно понять.. Самый хорошый учитель это примеры. Можешь дать свой класс? Буду огромно благодарен
 
Говорят что zend очен медленный и огромный, предназначен для больших проэктов..
 
Я же не предлагаю тебе пользовать зенд. Я лишь привел пример класса, реализующего RBAC (Управление доступом на основе ролей) по твоей просьбе.
 
Tashkentchi, спасибо за поддержку, разобрался (сделал чуть по другому но всётаки :-)). Сейчас пишу структуру БД форума. Возникли следующие вопросы:
1. Сообшении из всех темах (всех разделов) хранить в одну таблицу или создать на раздел свою таблицу?
2. Что нужно хранить в таблице(ах) сообшении? Всмысле id раздела, id подраздела и id темы, или только id темы а потом с помошью этой id узнать раздел и подраздел?
Мне интересует ваши мнения и как делайте вы.
 
Для нас - новичков самой трудной задачой является ПРАВИЛЬНО выставлять ключи в таблицах.. Вот столкнулся с проблемой. В таком запросе:
PHP:
SELECT COUNT(*) FROM `letters` WHERE `towhom` = '".$userID."' AND `read` = '0' AND `in` = '1'"
Который делается на каждой странице, лучше выставлять составной ключ типа
PHP:
KEY (`towhom`,`read`,`in`)
?
 
по содержанию - да. по порядку - будет зависеть от других запросов.
 
zerkms
По этой запросе ведь этот порядок ключа правильный?
 
LONGMAN
конкретно в этом запросе - да, лучше будет так. но и с любым другим порядком он тоже работать будет.
 
zerkms
Если поставить составной ключ на поля
PHP:
KEY (`col1`,`col2`)
то в запросе:
PHP:
SELECT ... WHERE `col1` = 5
будет использован ключ `col1`?

-~{}~ 24.04.09 16:39:

Знатоки, ответьте пожалуйста, это очен важно для меня..
 
Сверху