Например, у меня есть пользователь, и у пользователя есть другое право пользователя, например, пользователь может иметь
-create file -read file -update file -delete file
4, я могу использовать 4 BOOL, чтобы найти пользователя правильно, но если у пользователя больше прав, мне нужно создать все больше и больше BOOL для сохранения права. Я не думаю, что это хорошая идея. И я думаю о том, чтобы получить длинное целое для этого … например, пользователь может сделать все, что составляет 1111. Создавать файл 1000, читать файл 100, обновление – 10, delete – 1. Итак, если только пользователь get read file right – 0100.
Есть ли лучшие идеи? Спасибо.
Я предлагаю преобразовать привилегии (права) в двоичном состоянии, а затем хранить его в базе данных как длинную целую или шестнадцатеричную строку (VARCHAR; для хранения большого количества прав).
пример
$privileges_list = array( 0 => 'create_file', 1 => 'read_file', 2 => 'update_file', 3 => 'delete_file', 4 => 'create_pool', 5 => 'vote_in_pool', 6 => 'create_gallery', 7 => 'upload_images', 8 => 'view_statistics' );
Поэтому, если вы хотите установить create file
, update file
и view statistics
права view statistics
для пользователя, просто поместите 1 в соответствующие позиции в строке (0, 2, 8) и 0 для остальной части
$binary_string = "100000101";
Последним символом в этой строке является позиция 0, сначала позиция 8.
Теперь вы можете преобразовать эту строку в целое число (261) или шестнадцатеричное число (105) и поместить его в базу данных в качестве набора привилегий для этого пользователя (я предпочитаю hex).
Чтобы преобразовать это значение обратно в список привилегий, вы можете использовать что-то вроде этого
function hexvalue2privileges($hexvalue, $plist) { $res = array(); $res_assoc = array(); for ($i = strlen($hexvalue) - 1; $i >= 0; $i--) { $bin = str_pad(decbin(hexdec(substr($hexvalue, $i, 1))), 4, '0', STR_PAD_LEFT); $bin_array = array_reverse(str_split($bin, 1)); foreach ($bin_array as $bitstate) $res[] = $bitstate == '1' ? true : false; } foreach ($plist as $key => $id) { $res_assoc[$id] = $res[$key]; } return $res_assoc; }
и вызовите эту функцию
print_r(hexvalue2privileges('105', $privileges_list));
Выход будет
Array ( [create_file] => 1 // true [read_file] => // false [update_file] => 1 // true [delete_file] => // false [create_pool] => // false [vote_in_pool] => // false [create_gallery] => // false [upload_images] => // false [view_statistics] => 1 // true )
С каждым шестнадцатеричным символом вы можете хранить 4 права, поэтому для вычисления количества символов необходимо использовать эту формулу
$chars_needed = floor((count($privileges_list)-1) / 4) + 1; // result 3
Чтобы получить общую длину двоичной строки
$binary_length = $chars_needed * 4; // result 12
Чтобы установить длину установленных привилегий
$binary_string = "100000101"; $binary_string = str_pad($binary_string, $binary_length, '0', STR_PAD_LEFT); // result '000100000101'
Чтобы преобразовать $ binary_string в hex
$binary_string = "000100000101"; $hexvalue = ""; $groups = str_split($binary_string, 4); foreach ($groups as $group) $hexvalue .= dechex(bindec($group)); // result $hexvalue='105' (1=0001, 0=0000, 5=0101)
Также вы можете создавать группы привилегий и назначать их пользователям, создавая привилегии для каждой группы (администраторы, модераторы, гости, vip и т. Д.).
Надеюсь это поможет
Используйте [flags CHAR(10) default '0000000000']
Всякий раз, когда вам нужна какая-либо цифра, вы можете использовать ее как
1-я цифра – новая
Вторая цифра – Изменить и т. Д.
Во время хранения вам просто нужно изменить этот бит и сохранить как этот 1100000000. Вот и все.