如何以优雅的方式表示用户权限?

时间:2011-09-01 02:49:28

标签: php authentication

以下是用户权利表

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 个答案:

答案 0 :(得分:5)

您可以使用bitmask

如果您的所有权限都是(或可以概括为)一组是/否条件,那么这很容易。

在您的示例中,您有创建,读取,更新和删除。那是4位,所以你需要一个4位数来存储权限。 (二进制0000到1111 =十进制0到15)

只能阅读的人将拥有权限0100(十进制4),并且可以创建/读取/更新的人将拥有权限1110(十进制14)。拥有完全访问权限的管理员将拥有权限1111(十进制数为15)。

在PHP中检查这些内容的方法是使用按位OR运算符|

例如

// 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位的权限结构:创建,读取,删除,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 )赋予权限Read /更新但不创建/删除。以相同的方式,每个整数具有与之关联的一组权限。您可以在整数中存储尽可能多的权限,因为有多个位表示该整数(通常为32)。

所以你可以看到,使用4位整数(十进制数0到15)可以给你4个是/否权限。如果您使用32但是整数,则最多可以有32个是/否权限。

检查PHP documentation如何确定整数的最大大小。 (这取决于您运行PHP解析器的平台)。我认为一般来说32位系统/ OS将允许32位整数,而64位系统/ OS将允许64位整数。

在SO上查看these other threads,了解使用位掩码与其他方法的优缺点。