我有一个带有许多受限区域的PHP脚本。在这些区域中的每一个中,我都有一个函数,通过检查“usergroup”表来检查用户是否有权访问当前区域。这个问题是我现在有超过100列,所以我不确定这是否是一个正确的数据库设计。用户权限表结构
用户权限表结构
回答
我认为这可能是不正确的做法。
你应该像
群组不见了的东西
- UserGroupID
- UserGroupDescription
UserGroupRules
- RuleID
- RuleSection
- RuleSubSection
UserGroupRuleLinks
- UserGroupID
- RuleID
然后可以简单地检查组是否具有相关的适当规则。
有些人会告诉你去使用基于角色的权限结构,但我更喜欢自己的二进制权限。回想一天,我会使用一个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个字符,并使用更小的数字。
希望是有道理的。这是一个令人困惑的系统,但一旦运行,它会使权限处理成为一个梦想。
随着时间的推移,这是一个典型的问题。该模型以六种权限开始,随着时间的推移,它会增长到很长一段时间,此时它变得丑陋和难以管理。我想查看role based access control。您定义了一系列可以分配给用户的角色。权限然后分配给角色,而不是用户。这使得用户管理变得非常简单,即使对系统知之甚少的用户也不需要从数百个权限中进行选择,而是从少量角色中进行选择。无论何时你需要更多的粒度,简单地创建新的角色。
它可能看起来令人生畏在第一,但你实际上是在寻找少数几个表格:
- user_role_assn
- 作用
- role_permission_assn
- 许可
- permission_object(查找)
- permission_operation(lookup)
几个月前,我实现了基本的RBAC规范,最初的修订只花了3-4天的时间来构建和实施。
- 1. 数据库权限结构
- 2. 用户权限列表
- 3. SQL Server用户表权限
- 4. 用层次结构管理用户权限
- 5. DB中的用户权限层次结构
- 6. 取决于用户权限的复杂UI的体系结构
- 7. 创建用户,角色,社区,权限访问体系结构
- 8. 用户权限
- 9. 用户权限
- 10. 用户权限
- 11. 用户权限
- 12. 如何构建cms的用户权限
- 13. 管理用户权限(用户层次结构)的正确方法
- 14. JSON结构 - 授权用户菜单
- 15. 注册表更改权限删除其他用户权限
- 16. Apache用户权限
- 17. Wkhtmltopdf用户权限
- 18. FTP用户权限
- 19. chmod用户权限
- 20. Android用户权限
- 21. MySQL用户权限
- 22. JBoss用户权限
- 23. asp.net用户权限
- 24. ASP.NET用户权限
- 25. 操作,权限和体系结构
- 26. MySQL - 对象权限的结构
- 27. 如何管理用户访问权限和用户权限
- 28. 授予用户权限来访问表
- 29. 获取用户权限列表中
- 30. 使用Testflight构建权限
从存储的角度来看,这似乎很好,但从可维护性/查询方面来看,这会非常困难。 – 2010-02-17 05:14:34
我认为关于可维护性的唯一主要障碍就是它是一种不常见的方法。然而,对于熟悉布尔逻辑和base64编码基础知识的人来说,这是一个可靠的设计。此外,将所有基本的部分抽象为易于使用的类并不是那么困难。也许它不适合每个人的目的,但从我自己的经验来看,它发现它在复杂性和灵活性之间取得了非常舒适的平衡。 – 2010-02-17 09:13:57