группы пользователей и их разрешения на управление сайтом - PullRequest
1 голос
/ 09 октября 2010

Каков наилучший способ предоставления определенных действий / разрешений пользователям в зависимости от их группы? Допустим, есть 3 группы - пользователь, администратор и бухгалтер. Пользователь может выполнить action1, admin - action1,2,3, accountant - action1 и 2. Может ли это быть так:

if(group == user){ action1(); //function }
if(group == admin){ action1(); action2(); action3(); }
if(group == accountant){ action1(); action2(); }

Все действия будут сохранены в файле functions.php и затем включены в страницу. Будет ли это хорошей идеей или есть лучшее решение для этого?

Ответы [ 3 ]

3 голосов
/ 09 октября 2010

Использование компараторов, таких как

if (admin) {do x}
else if (user) {do y}

Плохая идея, поскольку она негибкая и плохо масштабируется.

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

admin - 1, 2, 3
accountant - 1, 2
user - 1

Тогда вы можете дать им цифры и сказать

if (permissionValue => 500)
{
    action2();
}

И есть таблица:

admin        1000
accountant   500
user         250

Это позволяет вам добавить новый тип пользователя (скажем, модератор) между администратором и бухгалтером, но не будет работать, если у вас есть:

admin        1, 2, 3
accountant   1, 2
moderator    1, 3
user         1

Поскольку разрешения для модератора и бухгалтера находятся на одном уровне.

На сегодняшний день лучшим решением является использование побитовых операторов и присвоение двоичных значений вашим защищенным областям.

Возьмем простой пример, где пользователь может читать контент, модератор может читать и писать контент, а администратор может читать, писать и удалять контент. Вы получите следующую таблицу (значения построены с использованием побитового или оператора)

Users:          Read    Write    Delete
admin:     7 - (0b001 | 0b010 |  0b100)  = 0b111 = 7
moderator: 3 - (0b001 | 0b010 |  NO   )  = 0b011 = 3
user:      1 - (0b001 | NO    |  NO   )  = 0b001 = 1

Затем вы можете сделать:

//Permissions:
define('READ', 1);
define('WRITE', 2);
define('DELETE', 4);

if ($userPermissions & READ)
{
    //Allowed to Read
}


if ($userPermissions & WRITE)
{
    //Show write form
}

Это примеры побитовых операторов. Это означает, что если x содержит бит y, вернуть true. Для функции записи

User         Permission
User            Write
1        &        2
0b001    &      0b010 -- returns false
Admin           Write
7        &        2
0b111    &      0b010 -- returns true

В первом примере 0b001 не содержит бит 0b010, поэтому возвращает false. 0b111 содержит бит 0b010 и возвращает true.

Подробнее Здесь

1 голос
/ 09 октября 2010

Может ли пользователь быть частью более чем одной группы? Если нет, создайте таблицу в вашей базе данных:

Group
group_id   INT (for sorting)
group_name VARCHAR
user_id    INT

В противном случае создайте таблицу Group | group_id, group_name и таблицу Group_User_affiliation | group_id, user_id

Очевидно, адаптируйте их к вашей схеме именования.

Если у вас уже есть подход ООП (с классом User), добавьте поле .group. В противном случае создайте такие функции, как STRING get_group(INT $user_id), которые затем будут запрашивать базу данных.

0 голосов
/ 10 октября 2010

Я бы сделал еще две таблицы в базе данных, скажем, permissions всего с двумя полями - идентификатор и имя, ну, может быть, плюс еще 1 - заголовок (для чтения человеком).А второй - groups_permissions.Затем просто добавьте некоторые разрешения, например: 'action_one', 'action_two', 'and_another_action'

Затем в самом php проверьте права доступа следующим образом:

if ( has_permission('action_one') ) {
    action_one();
}

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

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

$permissions['admin'] = array('create_all', 'delete_all', 'update_all', 'ban_users', 'etc.');
$permissions['moderator'] = array('update', 'delete');
$permissions['user'] = array('view_members_area', 'create_post', 'update_own', 'etc');

И, как в методе выше, проверьте вызов через функцию перед вызовом действия

...