【问题标题】:Group / User based security. Table / SQL question基于组/用户的安全性。表/SQL问题
【发布时间】:2010-03-24 09:21:47
【问题描述】:

我正在建立一个基于组/用户的安全系统。

我有4张表如下:

  • 用户
  • 群组
  • group_user_mappings
  • acl

其中 acl 是 item_id 与组或用户之间的映射。

按照我完成 acl 表的方式,我有 3 列注释(实际上是第 4 列作为自动 ID,但这无关紧要)

  • col 1 item_id(要访问的项目)
  • col 3 user_id(允许访问的用户)
  • col 3 group_id(允许访问的组)

例如

item1,彼得,,

item2, , group1

项目3,简,,

因此,acl 将授予用户或组访问权限。 ACL 表中的任何一行具有项目 -> 用户映射或项目组。

如果我想要一个返回用户可以访问的所有对象的查询,我想我需要一个带有 UNION 的 SQL 查询,因为我需要 2 个单独的查询,它们像这样连接......

item -> acl -> 组 -> 用户 AND 项目 -> acl -> 用户

我想这可以正常工作。这是它通常的做法吗?我这样做对吗?

看起来有点乱。我想我可以通过为每个人创建一个用户组来解决这个问题,所以我只在我的 SQL 中处理组,但这似乎也有点混乱..

【问题讨论】:

  • 我有类似的设置,但不允许为用户分配角色,只分配组,然后将用户分配到组。如果事实证明一个组中只有一个用户,那就这样吧,但这会使整个事情更容易管理。而且,实际上,只有一个用户,您将拥有多少个组?此外,您的设计中没有任何内容可以阻止用户直接或通过组分配给他们的权限。然后,该角色将在您的查询中出现两次;另外,当您想撤销权限时,您必须记住检查直接访问权限和组访问权限。
  • 谢谢,我觉得如果这一切变得太难了,我会走这条路:)

标签: sql mysql sql-server


【解决方案1】:

您本身不需要 2 个单独的查询:

select
    * /* correct to columns needed */
from
    users u
        left join
    group_user_mappings g
        on
            u.user_id = g.user_id
        inner join
    acl
        on
            (acl.user_id = u.user_id or
             acl.group_id = g.group_id)
/* TODO - Add more tables, where clause, etc */

【讨论】:

  • 很酷,工作 8-) 这是一个整洁还是凌乱的解决方案?我应该有 2 个单独的表,一个用于 user_acl,一个用于 group_acl 并将它们合并在一起,还是您认为这样可以?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 2023-02-08
  • 1970-01-01
相关资源
最近更新 更多