我知道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的爆炸
然后我在用户可以看到的每个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()来检查他们试图查看的当前页面是否在他们允许查看的页面数组内.
它现在非常快,但我只是认为必须有更快的方法来完成所有这些.
解决方法:
我想了很久以来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
}
一些链接:
标签:php,permissions
来源: https://codeday.me/bug/20190621/1256677.html