如何构建具有多个权限级别的多个用户?

时间:2009-07-13 23:27:18

标签: php sql mysql permissions

我正在使用的网站在处理用户和权限方面有一些令人费解的方式。

以下是用户类型:

  • 用户
  • 设施审批人
  • 设施管理员
  • 企业审批人
  • 企业管理

现在还有设施,这就是这些权限级别发挥作用的地方。设施与表格中的用户和用户级别相关联:

user_id     facility_id     userlevel
joebob      ABCInc          Facility Admin

到目前为止非常简单,但现在我想要的是能够允许一个用户级别为某个设施设置另一个用户级别的限制。例如,我是Facility Admin,我想只允许用户提交某些表单。我该如何储存?

我在想一个链接facility_id,userlevel和permissionlevel的新表。但究竟什么是权限级别呢?一个int?或者我会像canOrderThings或canSearchForStuff一样向表中添加列?

我看到了this是否会起作用,但如果您拥有大量权限,它似乎会变得有点混乱而难以跟踪。如何在不丢弃任何东西的情况下添加权限级别?或者甚至设置权限级别我认为会有点挑战。

用户级别也直接链接到用户表中的用户,但这些服务器的用途不同。

是否有更好的方法来构建所有这些?

2 个答案:

答案 0 :(得分:2)

使用第二个表格作为选项是一个好主意。一些论坛框架使用这种方法 您的每个用户都被赋予UserGroupId,这通常是一个Int,因为它们最容易使用。例如,UserGroupId为1,可以是管理员,2可以是教师(取决于您的组织)。

然后你有一个名为Permissions的表,在这个表上你包括所有选项作为Columns,就像这样。

UserGroupID --|-- SearchEnabled --|-- CanOrder
             1                   0           1
             2                   1           1

使用简单的二进制系统,1启用,0禁用,您可以控制每个用户组的选项。这允许您通过单个查询获得所有权限,同时仍然提供非常大的自定义区域。

您不必使用二进制数字。例如,您可以使用值1,2,3,其中1表示完全权限,2表示部分权限,3表示0。这取决于您的法规需要具体的具体程度。

现在,在允许用户执行选项之前,您需要对用户权限进行简单检查(您应该将其存储在数组或类中以便快速访问)。对于启用搜索的功能,您将使用诸如

之类的条件
If ($user['SearchEnabled')
{
   $generate->SearchOptions();
}
else 
{
   $generate->Error('NoSearchPermissions');
}

使用二进制数具有明显的好处,只需检查是否为TRUE或FALSE。如果您使用不同的编号系统,则需要更多工作,检查具体值
 If ($user['SearchEnabled'] == 2 || $user['SearchEnabled'] == 1)

答案 1 :(得分:0)

好吧,如果我想在我的应用程序中实现权限,我可以通过3种方式实现这一点(我可以想到最重要的):

  1. 在users表上(如果你正在使用orm,则记录)放一个级别int。例如,1级用户只能查看表单,2级可以发布,3级是管理员,可以编辑等等。然后在视图中,您只需检查用户是什么级别并回显表单,他们可以编辑等(根据你的问题,我认为这就是你已经在做的事情)

    优点:

    • 易于设置
    • 允许您将权限组合在一起。

    缺点:

    • 如果你需要1到2之间的等级,你必须做很多工作。因此,之后添加级别更难。
  2. 使用users表加入权限表。基本上是另一个回答者在这个帖子中描述的内容。

    优点:

    • 您不仅限于等级,您可以根据需要添加多个等级。
    • 您可以微调您希望每个用户能够做的事情。

    缺点:

    • 您无法对权限进行分组,但我想您可以根据需要立即分配权限。
    • 告诉用户他/她是什么是更多的工作,因为你只能列出所有权限或进行大规模切换以确定他们是否是管理员。 (例如:我是普通用户吗?我可以编辑表格,但不能搜索?)
  3. 结合使用这些,所以基本上在用户表上你可以有一个字符串,其值为“admin”,并且在每个页面上只显示他们是否是管理员。

    优点:

    • 您可以根据需要添加任意次数,而不会丢弃任何东西。类似“超级管理员”或“少管理员”

    缺点:

    • 如果您对每个用户进行微调,您最终会快速获得许多新用户类型。
    • 添加新的用户类型字符串可能很困难,除非将用户类型字符串表连接到权限,但现在我们变得非常复杂。