用户权限表结构

时间:2010-02-17 04:41:31

标签: mysql database database-design

我有一个包含许多限制区域的PHP脚本。在每个区域中,我都有一个功能,通过选中“usergroup”表来检查用户是否可以访问当前区域。那个问题是我现在有超过100列,所以我不确定这是否是正确的数据库设计。

3 个答案:

答案 0 :(得分:1)

我认为这可能是错误的方法。

你应该选择像

这样的东西

<强>群组

  • UserGroupID
  • UserGroupDescription

<强> UserGroupRules

  • RuleID
  • RuleSection
  • RuleSubSection

<强> UserGroupRuleLinks

  • UserGroupID
  • RuleID

然后可以简单地检查该组是否具有相关的适当规则。

答案 1 :(得分:1)

随着系统的不断发展,这是一个经典问题。该模型以六个权限开始,随着时间的推移,它会增长到很多时间,此时它变得丑陋且无法管理。

我会调查role based access control。您可以定义一系列可分配给用户的角色。然后将权限分配给角色,而不是用户。这使得用户管理非常容易,即使对于对系统了解不多的人 - 而不是必须从数百个权限中进行选择,他们从少数角色中进行选择。无论何时需要更多粒度,只需创建新角色即可。

一开始可能看起来令人生畏,但实际上你只看几张桌子:

  • user_role_assn
  • 作用
  • role_permission_assn
  • 许可
  • permission_object(查找)
  • permission_operation(查找)

几个月前我实施了基本的RBAC规范,初始修订只花了3-4天来构建和实施。

答案 2 :(得分:0)

有些人会告诉你使用基于角色的权限结构,但我更喜欢自己的二进制权限。回到那一天,我会使用一个int字段,它会给我32个不同的标志,我可以设置。权限表将包含每个标志的名称和值,而许可表将包含适用于每个用户的所有权限。我还实现了一个组结构,并将权限字段拆分为allow和deny,这给了我很大的灵活性。基本上,权限的计算方式如下:

AllowMask = userPermit.AllowPermissions;
DenyMask = userPermit.DenyPermissions;
foreach(groupPermit in groups.UserMemberOf(UserID))
{
   AllowMask = AllowMask | groupPermit.AllowPermissions;
   DenyMask = DenyMask | groupPermit.DenyPermissions;
}
Permissions = AllowMask & ~DenyMask

从那里获得标志值并检查Permissions & FlagValue > 0;

是一件简单的事情

正如您在问题中所指出的那样,32个标志可能还不够。我遇到了同样的问题,并开始使用包含base64编码数字的varchar字段。由于base64字符保持6位,我只需要确保字符长度是4x6 = 24/8 = 3的四倍。这给了我足够的空间将4个字符块转换为整数并在它们上运行上述函数。如果一个标志大于2 ^ 24,我只剪掉4个字符并使用较小的数字。

希望这是有道理的。这是一个令人困惑的系统,但一旦它运行它就会使权限处理梦想。