我知道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中选择permgroups
然后,我在permgroups上使用PHP的explode
然后,我对用户可以看到的每个perm组执行foreach
在foreach中,我运行sql查询从权限组中获取canseepages变量
然后我把它附加到一个变量上,这样我就得到了大量的东西,比如
$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()检查他们试图查看的当前页面是否在允许他们查看的页面数组中。
它现在相当快,但我只是在想,一般来说,肯定有一种更快的方法来完成所有这些工作。
发布于 2010-12-06 21:49:16
很久以前,我就知道位掩码是用户权限的最佳解决方案:
简短的示例:
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
}一些链接:
发布于 2010-12-06 20:43:24
这可能不适用于您,但通常您会将权限应用于系统的各个部分,而不是单个页面。例如,你可能有一个'admin‘权限,可以解锁所有大的adminy部分。
您可以使用管理员perm来解锁在系统中添加、编辑和删除用户的功能。因为极少有人需要能做这些事情中的一件,但不是全部。
另一种方法是特定于任务的权限系统。这个站点使用了一个,你已经使用了足够长的时间来获得其中的一些。
发布于 2010-12-06 21:27:37
为什么不使用整数数组作为位掩码呢?然后你只需像这样做
$ndx = $pageNo / PHP_INT_SIZE;
$bit = $pageNo % PHP_INT_SIZE;
$canAccess = $permArray[$ndx] & (1<<$bit);$pageNo是用户尝试访问的页面编号,$permArray是表示组允许的页面的整数数组。如果设置了页面对应的位,则用户可以访问该页面。
(如果语法错误,很抱歉,我很久没有使用PHP了。)
https://stackoverflow.com/questions/4366450
复制相似问题