【问题标题】:relate complex user permissions to one table将复杂的用户权限与一张表相关联
【发布时间】:2012-11-18 22:30:36
【问题描述】:

我有以下表结构:

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 表,可以将配置文件添加到角色,如果需要,也可以添加到用户。

主要问题是如何将用户/组/角色/配置文件与实体相关联?以及如何定义权限?我的想法是在Entity 中创建列'user_id'。查询Entity记录时,查找用户,查看用户属于哪个角色、组、个人资料等。但我认为它太复杂了,也许可以有更简单的方法,不需要很多额外的表。我会很感激你的建议:)

【问题讨论】:

    标签: sql database database-design relational-database


    【解决方案1】:

    标准模式是将 Principal 定义为您可以为其分配权限的任何内容。那么用户、用户组和角色都是主体的例子。一种实现方法是拥有一个principal_id作为主键的principal表,然后通过user_id关联用户表,通过role_id关联角色表,通过user_group_id关联组表。

    然后,您将在实体上有一个 entity_owner_principal_id 列,以及一个带有 entity_id、principal_id 的 entity_permissions 表。您可以在此表中添加“read”、“delete”、“update”等列,或者使用更灵活的内容。

    您可能还想考虑组和角色之间是否有任何真正的区别,它们都是对用户进行分组的方式,而且您似乎在这两种方式中也有层次结构。

    【讨论】:

    • 这将类似于this?1) 如何处理entity_owner_principal_id - 我认为它是否是 entity_permission_id? 2) 如何正确命名Principal 表? 3) 分析和复杂查询会很快吗(它只是大项目的一小部分)?谢谢!
    • 类似的东西,虽然如果你的工具可以显示 1-1 关系会很好。我不确定模块位,但我认为问题与此无关。
    • 我更新了之前的评论 - 有一些问题。将 1 对 1 关系船放在哪里?
    • 我会让主体和用户之间的关系为 1-1,id 到 id。我会让校长成为主人。类似地,我将拥有 user_groups 1-1 的主体,主体是 id id 上的主人,角色也是如此。 principal 会有一个顺序的 id 列表,其他的会从 principal 记录继承它们的值。
    • 我更新了图表hereEntities entity_owner_principal_id 怎么办?我不确定什么是列(它是为创建者 user_id 设计的?)。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多