DNB*_*ims 1 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
Run Code Online (Sandbox Code Playgroud)
情况就是这样.我想将所有验证用户权限放在一个单独的类中来处理.并且所有操作都有一个已定义的名称,例如:create_post,read_post.另外,让user_role传入,比方说:role_guest,role_user.验证课做了所有的魔术.你觉得这个设计怎么样?谢谢.
你可以使用位掩码.
如果您的所有权限都是(或可以推广到)一组是/否条件,那么这很容易.
在您的示例中,您有创建,读取,更新和删除.那是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.
}
Run Code Online (Sandbox Code Playgroud)
如果您想要更多权限,只需要引入更多位.
至于你的更新所有帖子/删除自己的帖子在你的例子中,我将有一个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
Run Code Online (Sandbox Code Playgroud)
这意味着INTEGER 6(在BINARY中等于0110)给予权限读取/更新但不创建/删除.以相同的方式,每个整数都有一组与之关联的权限.您可以在整数中存储尽可能多的权限,因为有多个位表示该整数(通常为32).
所以你可以看到,使用4位整数(十进制数0到15)可以给你4个是/否权限.如果您使用32但是整数,那么您最多可以拥有32个是/否权限.
查看PHP文档,了解如何确定整数的最大大小.(这取决于您运行PHP解析器的平台).我认为一般来说32位系统/ OS将允许32位整数,而64位系统/ OS将允许64位整数.
检查SO上的其他线程,以讨论使用bitmasks与其他方法的优缺点.