2010-10-09 2 views
1

Что было бы лучшим способом предоставить определенные действия/разрешения пользователям в зависимости от их группы? Предположим, что есть 3 группы - пользователь, администратор и бухгалтер. Пользователь может сделать ДЕЙСТВИЙ1, админ - action1,2,3, бухгалтер - ДЕЙСТВИЙ1 и 2. Может быть так:групп пользователей и их разрешения для управления сайтом

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

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

+0

Позора вы Арен Использование Perl с Catalyst в качестве авторизации на основе роли отлично выглядит. Тем не менее, это может дать вам некоторое вдохновение: http://search.cpan.org/perldoc?Catalyst::Manual::Tutorial::06_Authorization – Quentin

ответ

1

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

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), которые затем запрашивают базу данных.

3

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

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 так возвращает ложь. 0b111 действительно содержит бит 0b010 и возвращает true.

Подробнее Here

0

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

Тогда в PHP сам проверить разрешений, как это:

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

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

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

$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'); 

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

Смежные вопросы