我知道vBulletin使用了bitperms,我也在使用它们但是当我到10^63
时它们停止工作,它不能处理任何大于它的数字(它是我的PHP主机)。
我很想知道用于权限系统的网络使用的myBB, PhpBB, IPB, Joomla
和其他脚本是什么,我真的想在我的脚本中使用快速权限设置。现在我已经在每个名为permgroups的用户上实现了一个sql变量,并且会有一个1,4,5
这样的值,并且这些数字中的每一个都对应一个权限组,该权限组具有一个名为canseepages 1,2,3,4,1,4,1,54,6,4,5,22,6,2,3,4,1,2
的类似变量。到我的每一页。
首先我在PHP中选择permgroup
然后我在permgroups上使用PHP爆炸
然后我在用户可以看到的每个perm组上做一个foreach
在foreach中我运行一个sql查询来从权限组中获取canseepages变量然后我将它附加到一个变量,所以我最终得到像MASSIVE一样的东西
$variable = '1,2,3,4,5,6,7,8,9,2,22,55,44,55,33,44,11,44,33,44,11,33,44,'.
'22,33,44,11,22,33,44,33,11,22,33,44,33,22,33,44,55,44,'.
'55,54,26,77,84,645,345,233,11,4,11,3,32';
该变量表示允许用户查看的所有页面。然后我将其分解为数字数组,并使用in_array()
检查他们尝试查看的当前页面是否在他们允许查看的页面数组内。
现在速度相当快,但我只是认为必须有更快的方法来完成所有这些。
答案 0 :(得分:4)
也许这不适用于您,但通常您会将权限应用于系统的各个部分,而不是单个页面。因此,例如,您可能拥有“管理员”权限,可解锁所有大型管理员部分。
您可以拥有一个经理perm,可以解锁从系统添加,编辑和删除用户的功能。因为非常罕见地需要某人可以做这些事情中的一件,但不是全部。
另一种选择是特定于任务的权限系统。这个网站使用一个,你已经存在足够长的时间来获得其中一些。
答案 1 :(得分:1)
我想了很久以前Bit掩码是用户权限的最佳解决方案:
简短示例:
class UserPermissions()
{
private $Mask = 0;
//Levels
const PUBLIC_READ = 1;
const PUBLIC_WRITE = 2;
const PUBLIC_EDIT = 4
const PUBLIC_DELETE = 8;
//ETC
public function __construct($Mask)
{
$this->Mask = $Mask;
}
public function InvokePermission($Bit)
{
return ($Mask & $Bit); //True / False
}
public function AddPermission($Bit)
{
$this->Mask |= $Bit; //Add the bit to the mask
}
public function RevokePermission()
{
$this->Mask &= ~ $Bit;
}
public GetMask()
{
return $this->Mask;
}
}
简单使用如下:
$Permissions = new UserPermissions($User->PermissionsData);
if($Permissions->InvokePermission( Permissions:: PUBLIC_EDIT ))
{
//Use can edit
}
一些链接:
答案 2 :(得分:0)
为什么不使用整数数组作为位掩码?那你就做点什么了
$ndx = $pageNo / PHP_INT_SIZE;
$bit = $pageNo % PHP_INT_SIZE;
$canAccess = $permArray[$ndx] & (1<<$bit);
$pageNo
是用户尝试访问的页面编号,$permArray
是表示组允许页面的整数数组。如果设置了与页面对应的位,则用户可以访问该页面。
(对不起,如果语法错误,我很长时间没有使用PHP。)