Как правильно представить права пользователя? - PullRequest
1 голос
/ 01 сентября 2011

Вот таблица прав пользователей

Post
        Guest User                      Admin 
Create    N     Y                         Y
Read      Y     Y                         Y
Update    N   Their own post ONLY        All
Delete    N     N (yes, user can't del)   Y

А вот и ситуация.Я думаю, что все права пользователя в одном классе должны быть обработаны.И все действия имеют определенное имя, например: create_post, read_post.Кроме того, необходимо передать user_role, скажем: role_guest, role_user.И класс валидации делает всю магию.Что вы думаете об этом дизайне?Спасибо.

1 Ответ

5 голосов
/ 01 сентября 2011

Вы можете использовать битовую маску .

Если все ваши разрешения (или могут быть обобщены) набором условий да / нет, это довольно просто.

В вашем примере у вас есть создание, чтение, обновление и удаление. Это 4 бита, поэтому вам нужно 4-битное число для хранения разрешений. (От 0000 до 1111 в двоичном виде = от 0 до 15 в десятичном виде)

Кто-то, кто может только читать, будет иметь права доступа 0100 (4 в десятичном виде), а тот, кто может создавать / читать / обновлять, будет иметь права доступа 1110 (14 в десятичном виде). Администраторы, имеющие полный доступ, будут иметь разрешения 1111 (15 в десятичном виде). ​​

Вы можете проверить их в PHP с помощью побитового оператора ИЛИ |.

Например

// you could write a function getUserPermission($strUsername)
// which returns a permission number, say 10 (1010 in binary)
// which means he/she can create/update but not read/delete
$userPermissions = getUserPermission("TedWong");

$permissionCreate = 8; // 1000;
$permissionRead   = 4; // 0100;
$permissionUpdate = 2; // 0010;
$permissionDelete = 1; // 0001;

if ($userPermissions | $permissionCreate)
{
  //user has permission to create
}

if ($userPermissions | $permissionRead)
{
  //User has permission to read
}

if (!($userPermissions | $permissionDelete))
{
  //User doesn't have permission to delete
}

if ($userPermissions | $permissionUpdate &&
    $userPermissions | $permissionCreate)
{
  //User has permission to create and update.
}

Если вам нужны дополнительные разрешения, вам просто нужно ввести больше битов.

Что касается вашего обновления всех постов / удаления собственных постов в вашем примере, у меня будет 5-битная структура разрешений: Create, Read, Delete, UpdateOwn, UpdateAll.

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

Вот полный список 4-битных разрешений для вашего примера:

0000 //  0: No Permissions
0001 //  1: Delete
0010 //  2: Update
0011 //  3: Delete + Update
0100 //  4: Read
0101 //  5: Read + Delete
0110 //  6: Read + Update
0111 //  7: Read + Delete + Update
1000 //  8: Create
1001 //  9: Create + Delete
1010 // 10: Create + Update
1011 // 11: Create + Delete + Update
1100 // 12: Create + Read
1101 // 13: Create + Read + Delete
1110 // 14: Create + Read + Update
1111 // 15: Create + Read + Delete + Update

Это означает, что INTEGER 6 (что в BINARY равно 0110 ) дает разрешения на чтение / обновление, но не на создание /Удалять. Таким же образом каждое целое число имеет набор разрешений, связанных с ним. Вы можете сохранить до целого числа разрешений в целом числе столько разрядов, которые представляют это целое число (обычно 32).

Таким образом, вы можете видеть, что с 4-битным целым числом (десятичные числа от 0 до 15) вы можете получить 4 разрешения да / нет. Если вы используете 32-но целое число, у вас может быть до 32 разрешений да / нет.

Проверьте PHP документацию о том, как определить максимальный размер ваших целых чисел. (Это зависит от платформы, на которой вы запускаете свой анализатор PHP). Я думаю, что в общем случае 32-разрядная система / ОС допускает 32-разрядные целые числа, а 64-разрядная система / ОС - 64-разрядные целые числа.

Проверьте эти другие темы на SO, чтобы обсудить плюсы и минусы использования битовых масок и других методов.

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