我建議轉換二進制狀態字符串和以後的權限(權利),將其存儲在數據庫中作爲長整數或十六進制字符串(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
權限的用戶只是把1上的適當位置字符串爲他們的休息(0,2,8)和0
$binary_string = "100000101";
此字符串中最後一個字符的位置爲0,第一是位置8
現在你可以在這個字符串轉換爲teger(261)或十六進制數字(105),並將其放入數據庫作爲該用戶的權限集(我更喜歡十六進制)。
要將此值轉換回權限列表,你可以使用這樣的事情
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爲十六進制
$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)
而且你可以創建組並通過爲每個組(管理員,主持人,客人,貴賓等)設置權限來將其分配給用戶。
希望這有助於
哪種語言? – skaffman 2011-04-14 15:43:28
我建議您使用長整數。非常輕,非常強壯。你需要什麼(C++,(My)SQL等)? – elslooo 2011-04-14 15:44:16
是否會有超過31或32個訪問權類型? – 2011-04-14 15:47:25