Реализация разрешений на основе репутации

Я создаю веб-сайт, на котором есть проекты, пользователи и разрешения для каждого пользователя или групп пользователей. Это инструмент совместной работы сообщества, и у меня есть 4 разных разрешения:

  • Создатель – вносить изменения, принимать изменения, изменять разрешения
  • Принять изменения
  • Вносить изменения
  • Посмотреть

Как я могу реализовать в базе данных такую ​​систему разрешений для групп пользователей?

Изменить: Группы / разрешения определяются по репутации, например, на StackOverflow.

Изменить 2 – более подробно: каждый файл должен иметь разрешение, для проектов необходимы разрешения по умолчанию для вновь созданных файлов, а также мне нужно настроить разрешения базы данных MySQL.

user_table id, etc permission table id, user_id, permission_type 

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

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

например, если у вас были константы

 PERMISSION_CHANGE_PERMISSIONS = bindec('001') = 1 PERMISSION_MAKE_CHANGES = bindec('010') = 2 PERMISSION_ACCEPT_CHANGES = bindec('100') = 4 

вы можете объединить эти значения в одно целое с помощью побитового оператора «|»

 (PERMISSION_CHANGE_PERMISSIONS | PERMISSION_MAKE_CHANGES) = bindec('011') = 3 = $users_combined_permissions 

затем, чтобы проверить, имеют ли они конкретное разрешение, используйте побитовый оператор «&»,

 ($users_combined_permissions & PERMISSION_MAKE_CHANGES) = true 

если вы это сделали, вам понадобится только одна запись db для каждого набора разрешений.

Для этого я использовал Zend_Acl в прошлом. Я могу порекомендовать его. Проверенная и проверенная библиотека, которую довольно легко реализовать и можно использовать автономно. Этот параметр будет хорошо масштабироваться, если после этого у вас будут разные схемы разрешений.

Я бы создал две таблицы; пользователей и рангов.

 User ----- id username rankID Ranks ------ id makeChanges acceptChanges changePermissions view 

Затем просто создайте различные ранги, которые вы хотите в таблице рангов, и установите идентификатор ранга пользователей, чтобы он соответствовал соответствующему, который вы хотите. Не забудьте установить в таблице рангов каждое поле значение 0 или 1; причем 0 не имеет этой способности и 1 имеет этот вариант.

Редактировать Если вы собираетесь делать это без базы данных, вы можете дать это с помощью классов или даже экземпляров в PHP5. Например, предположим, что вы указали имя для каждой из вещей, которые у вас были в исходном посте:

 Creator - make changes, accept changes, change permissions Reviewer - Accept changes Editor - Make changes Regular - View 

Тогда вы можете сделать что-то вроде ниже. (Путь к базе данных, очевидно, будет намного лучше, но это всего лишь пример.)

 class Regular { public function View() { //Do the view stuff in here } } class Editor extends Regular implements Edit { } class Reviewer extends Regular implements Review { } interface Review { public function AcceptChanges() { //Do the accept changes here } } interface Edit { public function MakeChanges() { //Do the make changes stuff here } } class Creator extends Regular implements Edit, Review { public function ChangePermissions() { //Do the change permissions stuff here } }