Существует два распространенных подхода к этой проблеме, каждый из которых включает разбиение допустимых операций на нечто дискретное, что вы можете назвать.(Удалите сообщения, создайте галереи, обновите код, сбросьте базу данных, запустите ракеты, откройте гаражные ворота.) Дайте каждому из них растровое изображение в битовом векторе (если вы хотите иметь менее 32 разрешений, это хорошои компактный механизм хранения: если вы думаете, что он превысит 32 разрешения, размер типичного целого числа, то, возможно, таблицу в вашей базе данных ...)
Итак, вы можете либо напрямую сопоставить пользователей с разрешениями («Я хочу предоставить gallery_create
на sarnold
») или вы можете сопоставить пользователей и разрешения через классы пользователей («Я хочу предоставить gallery_create
всем членам класса art_curator
; затем я хочу повысить статус пользователя»sarnold
от docent
до art_curator
").
Если вы напрямую сопоставляете пользователей с разрешениями, вы можете обнаружить странную кучу странных разрешений в годы развертывания.Если вы сопоставляете пользователей с классами, вы можете столкнуться с искусственными классами пользователей, потому что вы доверяли одному конкретному человеку с привилегией, но не с другими привилегиями.
Определение лучшего способа решения этой задачи по-прежнему остается открытымпроблема;Я написал о различных типах моделей разрешений Моделирование системы разрешений , которая может быть слишком большой или слишком малой информацией, в зависимости от того, насколько сложной вы хотели бы, чтобы ваша система стала.
Есливы хотели бы просто хранить разрешения в растровых изображениях (например, реализация ядра Linux CAPABLE()
для CAP_SYS_ADMIN
, CAP_DAC_OVERRIDE
и т. д.), тогда вы можете добавить новые привилегии с помощью чего-то очень простого:
if (requested_new_permission == "CAP_SYS_ADMIN")
user->permissions |= CAP_SYS_ADMIN;
else if (requested_new_permissions == "CAP_DAC_OVERRIDE")
user->permissions |= CAP_DAC_OVERRIDE;
...
Тогда, когда вам нужно проверить возможности:
if (CAPABLE(user, CAP_SYS_ADMIN))
reboot_server();
и макрос CAPABLE()
может выглядеть так:
# define CAPABLE (user, cap) ((user) -> permissions & (cap))
(Простите за C, я просто не очень хорошо знаю php; меня заставили исправлять слишком много ошибок php, чтобыя хочу выучить это сам.)
Если вы хотите сопоставить пользователей с разрешениями через пользовательские классы, то это может быть три таблицы: таблица users
, таблица groups
или classes
иpermissions
стол.classes
имеет столбцы для user_id
и permission_id
.Когда вам нужно проверить, можно ли предоставить разрешение, выберите класс пользователя, затем выберите разрешение в классе.(Прошло уже много лет с тех пор, как я написал SQL вручную; я уверен, что один запрос может дать вам ответ «да» или «нет», но я не уверен, будет ли это соединение с несколькими таблицами или использование подзапросов илибыло бы проще сделать два запроса к базе данных.:)
Надеюсь, это поможет.