2010-02-17 86 views
0

我有一个带有许多受限区域的PHP脚本。在这些区域中的每一个中,我都有一个函数,通过检查“usergroup”表来检查用户是否有权访问当前区域。这个问题是我现在有超过100列,所以我不确定这是否是一个正确的数据库设计。用户权限表结构

回答

1

我认为这可能是不正确的做法。

你应该像

群组不见了的东西

  • UserGroupID
  • UserGroupDescription

UserGroupRules

  • RuleID
  • RuleSection
  • RuleSubSection

UserGroupRuleLinks

  • UserGroupID
  • RuleID

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

0

有些人会告诉你去使用基于角色的权限结构,但我更喜欢自己的二进制权限。回想一天,我会使用一个int字段,它会给我32个不同的标志,我可以设置。权限表将包含每个标志的名称和值,许可证表将包含适用于每个用户的所有权限。我还实现了一个组结构,并将权限字段分为允许和拒绝,这给了我很大的灵活性。本质上的权限将被计算就像这样:

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个标志AREN够了。我遇到了同样的问题,并开始使用持有base64编码数字的varchar字段。由于base64字符持有6位,所以我只需确保字符长度是4x4 = 24/8 = 3的四倍。这给了我足够的空间将4个字符块转换为整数,并在其上运行上述函数。如果一个标志大于2^24,我会剪掉4个字符,并使用更小的数字。

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

+0

从存储的角度来看,这似乎很好,但从可维护性/查询方面来看,这会非常困难。 – 2010-02-17 05:14:34

+0

我认为关于可维护性的唯一主要障碍就是它是一种不常见的方法。然而,对于熟悉布尔逻辑和base64编码基础知识的人来说,这是一个可靠的设计。此外,将所有基本的部分抽象为易于使用的类并不是那么困难。也许它不适合每个人的目的,但从我自己的经验来看,它发现它在复杂性和灵活性之间取得了非常舒适的平衡。 – 2010-02-17 09:13:57

1

随着时间的推移,这是一个典型的问题。该模型以六种权限开始,随着时间的推移,它会增长到很长一段时间,此时它变得丑陋和难以管理。我想查看role based access control。您定义了一系列可以分配给用户的角色。权限然后分配给角色,而不是用户。这使得用户管理变得非常简单,即使对系统知之甚少的用户也不需要从数百个权限中进行选择,而是从少量角色中进行选择。无论何时你需要更多的粒度,简单地创建新的角色。

它可能看起来令人生畏在第一,但你实际上是在寻找少数几个表格:

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

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