2011-04-14 104 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.就是这样。

相关问题