【问题标题】:What's a good permissions system to use?有什么好的权限系统可以使用?
【发布时间】:2010-12-06 12:37:41
【问题描述】:

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

现在速度非常快,但我只是认为总体上必须有一种更快的方法来完成所有这些操作。

【问题讨论】:

    标签: php permissions


    【解决方案1】:

    也许这不适用于您,但通常您会将权限应用于系统的各个部分,而不是单个页面。因此,例如,您可能拥有“管理员”权限,可以解锁所有大型管理部分。

    您可以拥有一个管理员权限,解锁从系统中添加、编辑和删除用户的能力。因为很少有人需要可以做其中一件但不是全部的事情。

    另一种选择是特定于任务的权限系统。这个网站使用了一个,你已经有足够长的时间来获得其中的一些了。

    【讨论】:

      【解决方案2】:

      很久以前我就发现位掩码是用户权限的最佳解决方案:

      简短示例:

      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
      }
      

      一些链接:

      【讨论】:

      • 如果你有一系列“isBLANK”方法,而不是常量,使用起来会不会更自然一点?然后我可以将上面的代码简化为 if($Permissions->isPublicEdit()){} (其他操作同上)
      • 那么随着系统的增长,您将拥有许多不需要的方法,下一个最佳方案是使用数组而不是常量,但使用相同的方法实现,并使用 $Permissions->SetBitField($DB['fields']) 动态加载它们以便您可以在 ACP 中动态添加新的权限类型。
      【解决方案3】:

      为什么不使用整数数组作为位掩码?然后你就做类似的事情

      $ndx = $pageNo / PHP_INT_SIZE;
      $bit = $pageNo % PHP_INT_SIZE;
      $canAccess = $permArray[$ndx] & (1<<$bit);
      

      $pageNo 是用户尝试访问的页面编号,$permArray 是表示该组允许的页面的整数数组。如果设置了页面对应的位,则用户可以访问该页面。

      (如果语法错误,很抱歉,我很久没用PHP了。)

      【讨论】:

        猜你喜欢
        • 2011-03-02
        • 2015-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-12
        • 2020-08-06
        • 2012-04-15
        相关资源
        最近更新 更多