将复杂的用户权限与一个表相关联

时间:2012-11-18 22:30:37

标签: sql database database-design relational-database

我有以下表结构:

Entity
---------------------
id | name

Users
---------------------
id | name | password 

UserGroups
---------------------
id | parent_id | name

Users_UserGroups
---------------------
user_id | user_group_id

Roles
---------------------
id | parent_id | name

Users_Roles
--------------------
user_id | role_id

主要目标是在以下条件下创建Entity行级访问限制:

1)用户创建Entity - 他可以看到它(他是所有者)
2)用户组成员也可以看到它(但如果定义了其他 - 看不到 - 它将是用户私有的)。所以记录可以是用户或组私人,也可以是公共 - 所有人都可以看到记录。例如,用户在销售团队A中,并且有记录可以看到所有组成员,但是可以有一个或多个记录只能看到用户 - 可能是潜在客户。 3)例如,用户A的角色为salesman,此角色是父角色sales managers的子角色。然后,sales manager角色的用户可以看到用户A实体。角色的层次结构。老板可以看到他的直接雇员正在做什么:) 4)也会有profile表,其中可以将配置文件添加到角色,如果需要,也可以添加到用户。

主要问题是如何将用户/群组/角色/个人资料与实体相关联?以及如何定义权限?我的想法是将列'user_id'创建为Entity。查询Entity时,查看用户,查看哪个角色,组,个人资料是用户等等。但我认为这太复杂了,也许有更简单的方法,没有更多的额外表格。我很感激建议:)

1 个答案:

答案 0 :(得分:1)

标准模式是将Principal定义为您可以为其分配权限的任何内容。然后用户,用户组和角色都是委托人的例子。实现的一种方法是使用principal_id作为主键的主表,然后通过user_id将用户表与角色表相关联,通过role_id将角色表与group_group_id相关联。

然后你在entity上有一个entity_owner_principal_id列,在entity_permissions表中有entity_id,principal_id。您可以在此表中添加“读取”,“删除”,“更新”等列,或者使其更灵活。

您可能还想考虑组和角色之间是否存在任何真正的差异,它们既是对用户进行分组的方式,也是两者都具有层次结构。