【问题标题】:Design review - Performance and Scalability concerns for a role based access system设计审查 - 基于角色的访问系统的性能和可扩展性问题
【发布时间】:2013-03-17 12:03:34
【问题描述】:

我正在设计授权服务。它根据分配给用户的角色和对内容设置的权限执行访问控制。用户可以属于多个组。这些组也可以属于其他组。组下组下组的深度并没有那么大。内容可以在用户级别或组级别共享。内容也可以与多个组共享。允许对内容进行的操作是to-read 或to-read-write。

这是我对设计上述问题的解决方案的想法。问题是,它看起来非常简单。 我担心我遗漏了一些会损害设计性能或可扩展性的要点。这是设计。

数据存储: 每个用户可以有多个角色。角色是一个字符串,看起来像命名空间。 supergroup.group.subgroup.rolename。 每个内容可以有多个权限。权限是一个字符串,看起来像带有操作类型前缀的命名空间。 canreadwrite.supergroup.group.subgroup.rolename

授权算法 授权函数算法是这样的(PS这只是为了展示基础,实际上角色和权限数组会被排序,并且会使用某种形式的二进制搜索来进行匹配)

public bool CanReadWrite(string[] roles, string[] permissions)
{
    foreach (var role in roles)
    {
        foreach (var permission in permissions.Where(s => s.StartsWith(canreadwrite)))
        {
            string barePermission = permission.Remove(0, canreadwrite.Length);

            if (role.StartsWith(barePermission))
            {
                return true;
            }
        }
    }

    return false;
}

您认为这种设计有什么问题吗?有性能问题吗?可扩展性问题?

【问题讨论】:

    标签: security permissions authorization roles


    【解决方案1】:

    您的应用程序不是很清楚,尤其是这些用户组层次结构与角色/权限设计之间的关系。

    首先我会避免自己实现二进制搜索,而只是使用dictionaries。

    其次,我假设您可能拥有大量内容项和大量用户。看起来您最终可能会为每个内容项添加大量“点状权限字符串”,但您应该将每个内容的角色/权限条目数量保持在较小的水平,以提高性能和权限的可维护性。

    也许您可以从这些用户组层次结构中拆分角色定义/维护,即内容项只“知道”某些角色,而不是这些组。

    第三,如果您真的需要用户组的层次结构,我会考虑允许在适当的情况下将角色/权限附加到更高级别的组上,以避免需要始终在最低级别定义/维护角色/权限(假设很多低级别组可能)。

    s.a. RBAC at wikipedia

    【讨论】:

    • 第二个关注点不是真正的关注点,如“组下组的深度不是那么大”。我知道 1st 和 RBAC。第三是我要解决的问题。
    • 字典和哈希表对于这种分层树来说是一个糟糕的选择。
    • (第二个问题:)即使没有深度,您最终也可能会得到很多组——可能会附加到许多内容项(设计不佳)。
    【解决方案2】:

    除了两个非常奇怪的顶级组canreadwrite 或canread 之外,我找不到该方法的任何真正问题。如果一个愚蠢的管理员创建了这样的组,你的算法就会失败。

    因此我建议使用canreadwrite:supergroup.group.subgroup.rolename之类的东西。

    作为替代方案,您可以格式化关联,如角色等级:权限,使用StartsWith(roleName) 测试角色,使用EndsWith(":" + permissionName) 测试权限。

    例如supergroup.group.subgroup.rolename:canreadwrite

    【讨论】:

      猜你喜欢
      • 2013-04-14
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 2012-01-31
      • 1970-01-01
      • 2019-12-05
      • 2020-08-10
      相关资源
      最近更新 更多