以下是用户权利表
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。验证课做了所有的魔术。你觉得这个设计怎么样?谢谢。
答案 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,了解使用位掩码与其他方法的优缺点。