Как структурировать пользовательские разрешения для cms - PullRequest
5 голосов
/ 11 января 2011

Я создаю пользовательскую систему CMS для фотографий, и мне необходимо внедрить систему аутентификации и разрешений пользователей.Какова обычная в отрасли практика создания такой схемы.

В основном мне нужны пользователи, и пользователи могут быть разного типа.Допустим, некоторые пользователи могут создавать только галереи, другие могут только редактировать их или редактировать только определенные галереи и т. Д. Итак, как это должно быть структурировано.Я использую базу данных MySQL и использую PHP для кодирования CMS.

Я пытался посмотреть в Google, но нашел только статьи, в которых объясняется, как создавать пользователей для реальной базы данных MySQL.Я буду признателен за ссылку на статью, которая объясняет, как такие вещи должны быть сделаны.

Заранее спасибо.

1 Ответ

5 голосов
/ 11 января 2011

Существует два распространенных подхода к этой проблеме, каждый из которых включает разбиение допустимых операций на нечто дискретное, что вы можете назвать.(Удалите сообщения, создайте галереи, обновите код, сбросьте базу данных, запустите ракеты, откройте гаражные ворота.) Дайте каждому из них растровое изображение в битовом векторе (если вы хотите иметь менее 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 вручную; я уверен, что один запрос может дать вам ответ «да» или «нет», но я не уверен, будет ли это соединение с несколькими таблицами или использование подзапросов илибыло бы проще сделать два запроса к базе данных.:)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...