|
Система разграничения прав
|
|||
---|---|---|---|
#18+
Добрый день, подскажите можно ли упростить механизм проверки прав. Есть следующая структура данных(таблицы): users (user_id, name); role (role_id, name); user_role (user_id, role_id); role_actions (role_id, action_id); actions(action_id, name); Столкнулся со следующей проблемой, для того, чтобы проверить может ли пользователь совершить то или иное действие, необходимо или нагородить кучу if-ов или делать case, в том или ином случае приходится делать очень много проверок, и система плохо масштабируется. Пока пришел к выводу, что необходимо делать ещё одну сущность, которая будет связывать actions с объектами и проверять есть ли у пользователя такой action . Подскажите может стоит сделать как-то по другому? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2013, 14:38 |
|
Система разграничения прав
|
|||
---|---|---|---|
#18+
Stand-Up, Не пробовали уровни доступа хранить в виде битовых масок? Т.е. например. 00000000b - ничего нельзя 00000001b -можно что-то "1" 00000010b -можно что-то "2" 00000100b -можно что-то "3" и т.д. (8 наименований) У пользователя права будут выглядеть 00000101b -т.е. можно "1" и "3" Проверка что можно "3": 00000101b & 0000100b == 0000100b (& - битовое "И") будет истинно Проверка что можно "2": 00000101b & 0000100b == 0000010b (& - битовое "И") будет ложно Тогда не надо "городить кучу if-ов", а обойтись несколькими ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2013, 07:54 |
|
Система разграничения прав
|
|||
---|---|---|---|
#18+
mad_nazgulStand-Up, Не пробовали уровни доступа хранить в виде битовых масок? Т.е. например. 00000000b - ничего нельзя 00000001b -можно что-то "1" 00000010b -можно что-то "2" 00000100b -можно что-то "3" и т.д. (8 наименований) Дело в том, что у меня этих наименований около 40, и возможно еще будут добавляться, еще сложность в том, что активности связаны не только с обычными смотреть/редактировать/удалять. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2013, 09:54 |
|
Система разграничения прав
|
|||
---|---|---|---|
#18+
по сабжу: Все просто Всего одна таблица (упрощенно). Пользователь, тип права(н-р на отчет),ID объекта(н-р код отчета), право (integer) Набор функций для зачитки прав. Можно реализовать любую комбинацию прав. Роли не нужны, т.к. их можно заменить копированием прав со специальных "эталонных" пользователей. Почему я против ролей ? Потому что всегда есть случаи, когда из прав роли следует сделать некоторое исключение для конкретного пользователя. Создание же "прав-исключений-из-правил" - лишний уровень проверок. Кароч одни неудобства. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2013, 10:29 |
|
Система разграничения прав
|
|||
---|---|---|---|
#18+
LSV, роли есть в любом поставщике, а права - дополнительный костыль в секурити :) Лично за роли и права, одно другое дополняет. Роль админ, например. Не нужно опускаться до действий, сразу нативно на лету отстраиваем нужный интерфейс. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2013, 11:11 |
|
Система разграничения прав
|
|||
---|---|---|---|
#18+
Stand-UpДело в том, что у меня этих наименований около 40, и возможно еще будут добавляться, еще сложность в том, что активности связаны не только с обычными смотреть/редактировать/удалять. Активности - в виде битовых масок. (до 64 действий вам должно хватить) А потом на каждый объект "навешиваются права доступа". Т.е. (объект_ID, роль, права) Причем "роль" это и роль, и конкретный пользователь ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2013, 12:40 |
|
Система разграничения прав
|
|||
---|---|---|---|
#18+
Stand-Up, 1) Я бы добавил иерархию ролей, удобней администрировать (к примеру: обычный пользователь над ним опытный и далее супер админ) 2) Табличку object_role - где собственно будут назначены роли объектам 3) Добавил бы, User_object_actions которая заполнялась бы тригером из таблиц user_role , role_actions и object_role , для того, что бы не пересчитывать привилегии при каждом вызове объекта пользователем. Собственно по User_object_actions строил интерфейс. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2013, 16:15 |
|
Система разграничения прав
|
|||
---|---|---|---|
#18+
> у меня этих наименований около 40 Задайте себе вопрос: какие действия можно совершать с данными? Сравните количество этих действий с написанным. Сделайте простой вывод: > можно ли упростить механизм проверки прав упрощать здесь нечего. Но можно, слегка усложнив, привести к виду, удобному для использования. Направление рассуждений вы выбрали верное, но уровней абстракции у вас маловато. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2013, 17:00 |
|
|
start [/forum/topic.php?fid=33&fpage=17&tid=1547685]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
2ms |
others: | 297ms |
total: | 416ms |
0 / 0 |