Хранение прав доступа в базе.

mahoro

Новичок
Хранение прав доступа в базе.

Делаю систему аутентификации, стандартная вроде бы задача: Пользователи, группы, разделы сайта. Членство каждого пользователя строго в одной группе, наследование прав пользователя из прав его группы + персональные.
Возможность некоторые разрешения выставить для конкретного раздела (например, модерирование в раздела А, но не Б). Разделы создаются динамически.

При этом проверка должна быть максимально быстрой, как минимум для прав, неспецифичных для конкретного раздела. (Хочется в зависимости от прав доступа отрисовать корректное меню сайта, например). В идеале хочется иметь возможность получить их все простейшим запросом select.


Собственно, сейчас я имею таблицу прав вида:
| who | what | type | rule | section |
где type указывает на тип разрешения - групповое или персональное
who - ссылка на группу или пользователя.
section - раздел сайта

Но пока есть время подумать, рассматриваю такой вариант:

who | type | section | rule1 | rule2 | rule3 | ..... ruleN

А как бы сделали вы?

Какие могут быть подводные камни при работе с такими "широкими" таблицами? Колонок может быть до пятидесяти.
 

bkonst

.. хочется странного?...
Re: Хранение прав доступа в базе.

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

beba

Новичок
Я бы вообще сделал бы так.
Таблица для пользователей.
ид |имя | фамилия | последнее изменение | последнее вхождение | дата создания | кол-во вхождений | группа пользователей
Таблица для групп
ид | имя группы
Таблица для файлов
ид | имя файла | файл группа | файл в группе | группы

Если мне не изменяет память, что то подобное организовано в движке Commerce.
 

mahoro

Новичок
bkonst, вобщем, я решил оставить первый вариант :)

То, что вы указали меня не смущает, я вообще никаких серьезных аргументов не нашел ни за, ни против каждого из способов..

Но для первого способа вроде уже есть наброски, и еще он более логично выглядит.. субъективно..


beba
не, не то :)
 

Popoff

popoff.donetsk.ua
mahoro
Пользователи, группы, разделы сайта. Членство каждого пользователя строго в одной группе, наследование прав пользователя из прав его группы + персональные.
Возможность некоторые разрешения выставить для конкретного раздела (например, модерирование в раздела А, но не Б). Разделы создаются динамически.
В идеале хочется иметь возможность получить их все простейшим запросом select.
Не много ли Вы хотите?
А как бы сделали вы?
С какими системами Вы уже знакомы?
 

mahoro

Новичок
Не много ли Вы хотите?
Я же говорю, мне в идеале хочется так. Меня устроят и более реалистичные варианты. Хотя план действий я уже построил - данные о правах будут считыватья один раз при логине и далее храниться в сессии в сериализованном виде. (сессии хранятся в базе, все данные считываются за один запрос). Жертвой стала возможность изменения прав пользователя в "realtime" - ну и фиг с ней, специфика позволяет, это не универсальный механизм.

Сейчас получаю права на конкретное действие вот так:
Код:
   $rules = $db ->get_simple_hash ("SELECT g.grant_type as 'type', g.rule "
        ." FROM users u, auth_grants g, auth_actions a "
        ." WHERE ((u.id=g.who and g.grant_type='U') "
        ." OR (u.user_group=g.who and g.grant_type='G')) "
        ." AND g.what=a.id and u.login='".addslashes($user)."' AND a.alias='".addslashes($what)."'");
В принципе, это не так уж отличается от моего понятия "простейшего запроса". Главное, что он один и даже можно пооптимизировать его немного для некоторых частных случаев..

С какими системами Вы уже знакомы?
Ну, встречался с разными.. Контролеры в троллейбусе, турникеты в метро. Фэйс контроль в клубах.
Еще права юниксовых ФС и из готовых решений - phpGACL.

Но все не то, иначе не стал бы изобретать велосипед, сами понимаете..


p.s. Хм.. а вы фидошник, наверное. Как минимум бывший или латентный, точно. :)
 

mahoro

Новичок
Все не то..

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

И с тем, как это сделать - тоже.
И написал уже половину.

Всем спасибо.
 
Сверху