Помогите с проектиованием БД (права, группы и т.д.)

Духовность™

Продвинутый новичок
Помогите с проектиованием БД (права, группы и т.д.)

В соседней моей теме вчера мы пришли к выводу что мне нужна более универсальная структура БД для построения системы управления прав.

Но пока я что-то хреново понимаю группы\роли, хоть и читал доки, что нашел на форуме и за его пределами.

Мне, собственно, нужно сделать систему управления прав, при которой:

1. модераторы имели бы доступ только к тем модулям, на которые им даст права главный админ.

Накатал вот структуру БД: картинка

Есть таблица групп, в которой содержится информация о группе. Есть таблица связи пользователь-группа. Не уверен, нужна ли эта таблица :confused: - может просто добавить поле id_group в таблицу пользователей?

Дальше: При создании группы необходимо указать права на какие-то действия. Права я выставляю в таблице groups_rules, в которой перечислены все доступные в системе модули.

Пока хватит. Оцените, пожалуйста, свежим взглядом, в правильном ли направлении я иду?
 

berkut

Новичок
group_rules беспонтовая таблица. надо туды поля group_id | module_id | rights

rights по вкусу. например 0, 2, 4, 8, 16 - ничего, читать, писать, редактировать, удалять. и в group_rules составной флаг калякать
 

Pigmeich

Новичок
triumvirat
это значит все права пишутся в одно поле. А потом нужное право получается применением битовой маски.

Я тебе юниховскую систему предлагал - чем тебе не понравилось?

-~{}~ 23.12.07 13:24:

triumvirat
Главная проблема в точках на таблице group_rules.
При добавлении нового модуля придется изменять таблицу.

Правило: таблицы изменяются только при установке/сносе тебе не надо объяснять? Понимаешь benefit от запрещения на уровне БД CMS дропать таблицы.

Так что надо вводить еще один ключ: id модуля.

Юниховские права не просто так сделаны. Они позволяют писать права всегда в одну запись, независимо от колличества груп. И таблица с правами упрощается до невозможности.
 

Духовность™

Продвинутый новичок
Pigmeich
berkut

Т.е вот так будет правильно?

-~{}~ 23.12.07 14:14:

И ещё, скажите, а роли тут нужны или нет?

Сейчас я назначаю права группам.
Может лучше создавать сначала роли, т.е. набор прав для каки-то модулей, а потом назначать роли группам?
 

Pigmeich

Новичок
triumvirat
роли и группы - одна фигня. Отличие только в документации для End User.

triumvirat
нормально.
 

Духовность™

Продвинутый новичок
Pigmeich
почему одна? я думал, что роли - это набор прав, а группы - это набор пользователей, объединенных определенными ролями. Разве нет?
 

berkut

Новичок
щит. какой mod1_id? ненуно этого! ненадо! храни модули в отдельных строках
group_id | mod_id | rights
1 | 1 | 2
1 | 2 | 4

для каждой группы может существовать несколько строк, и енто не страшно

-~{}~ 23.12.07 16:20:

вообще почитай о нормализации бд. в мускл мануале есть шикарный раздел - _туториал_. божественная хрень должен отметить
 

Духовность™

Продвинутый новичок
щит. какой mod1_id? ненуно этого! ненадо! храни модули в отдельных строках
да да понял, просто там опечатка была.

-~{}~ 23.12.07 15:39:

Господа, а как реализовать суперадмина в контексте этой структуры?
 

Pigmeich

Новичок
Господа, а как реализовать суперадмина в контексте этой структуры?
Сисадмин (суперпользователь), классически реализуется просто записью имени пользователя или ID где-нибудь сбоку. Ибо он один.

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

Духовность™

Продвинутый новичок
Popoff
если честно, то я не осилил, сколько раз не пытался..

-~{}~ 23.12.07 16:38:

как-то сложно все.. в голове не остается ничего после прочтения..
 

berkut

Новичок
есть gacl, мощная штука, но здоровая и адо дб с собой таскает
 

Духовность™

Продвинутый новичок
berkut
я вот не понял это:
group_id | mod_id | rights
1 | 1 | 2
1 | 2 | 4
Какая-то непонятная структура - А если мне нужно дать группе доступ на чтение и удаление на конкретный модуль? Будут 2 записи что ли?
 

berkut

Новичок
создаёш константы:
define('READ', 2);
define('WRITE', 4);
define('DELETE', 8);

если нужно дать права на удаление и чтение, вычисляешь маску:
PHP:
$mask = READ | DELETE;
// маска на все 3 операции
$mask = READ | WRITE | DELETE;
и вот это значение впихиваешь в бд, в rights.
Что-бы проверить, имеет-ли группа права на чтение, эту маску проверяешь так
PHP:
if ($group_mask_that_we_just_get_from_db & READ)
 

berkut

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