Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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 для каждого набора разрешений.

Ответ 2

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

Ответ 3

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

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
    }
}