什么是好的权限系统?

时间:2010-12-06 12:37:41

标签: php permissions

我知道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()检查他们尝试查看的当前页面是否在他们允许查看的页面数组内。

现在速度相当快,但我只是认为必须有更快的方法来完成所有这些。

3 个答案:

答案 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。)