2011-04-14 102 views
1

例如,我有一個用戶,並且用戶有不同的用戶權限,例如,用戶可以有哪種數據類型適合存儲這種情況?

-create file 
-read file 
-update file 
-delete file 

4權利,我可以用4 BOOL找到用戶權限,但如果用戶有更多的權利,我需要創造更多和更多的BOOL來存儲權利。我不認爲這是一個好主意。我想爲此得到一個長整數...例如,用戶可以做的所有東西是1111. 創建文件是1000,讀取文件是100,更新是10,刪除是1.所以,如果用戶只讀取文件的權利是0100.

有沒有更好的點子?謝謝。

+0

哪種語言? – skaffman 2011-04-14 15:43:28

+0

我建議您使用長整數。非常輕,非常強壯。你需要什麼(C++,(My)SQL等)? – elslooo 2011-04-14 15:44:16

+1

是否會有超過31或32個訪問權類型? – 2011-04-14 15:47:25

回答

3

我建議轉換二進制狀態字符串和以後的權限(權利),將其存儲在數據庫中作爲長整數或十六進制字符串(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 fileupdate fileview 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) 

而且你可以創建組並通過爲每個組(管理員,主持人,客人,貴賓等)設置權限來將其分配給用戶。

希望這有助於

+0

+1,這是用來通過PHPBB,如果我沒有錯。 – Shoe 2011-04-14 16:55:40

+0

@Charliepiga,你是對的。 phpBB使用非常類似的系統爲用戶存儲權限。 – Wh1T3h4Ck5 2011-04-14 17:06:14

+0

不錯........... – dynamic 2011-04-14 17:12:25

1

使用[flags CHAR(10) default '0000000000'] 每當你需要的任何數字,您可以使用它像

第1位 - 新
第2位 - 編輯等

在存儲的時候,你只需要改變這一點,並像這樣存儲1100000000.就是這樣。

相關問題