当前位置: 首页 > 知识库问答 >
问题:

设计审查-基于角色的访问系统的性能和可伸缩性问题

锺离浩慨
2023-03-14

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

以下是我对上述问题设计解决方案的想法。问题是,它看起来很简单。我担心我遗漏了一些会影响设计性能或可伸缩性的要点。这是设计图。

数据存储:每个用户可以有多个角色。角色是字符串,看起来像命名空间<代码>超群。组分组。rolename。每个内容可以有多个权限。权限是一个字符串,类似于带有操作类型前缀的命名空间<代码>可以读写。超群。组分组。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;
}

你觉得这个设计有什么问题吗?有性能问题吗?可伸缩性问题?

共有2个答案

林念
2023-03-14

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

因此,我建议使用类似于canreadwrite:supergroup的东西。组分组。rolename

作为替代方案,您可以格式化rolehierarcy:permission这样的关联,使用StartsWith(roleName)测试角色,并使用EndsWith(“:”permissionName)测试权限。

例如超群。组分组。rolename:canreadwrite

广楚
2023-03-14

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

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

其次,我假设您可能有大量的内容项和大量的用户。看起来每个内容项都可能有大量的“虚线权限字符串”,但为了提高性能和维护权限,应该将每个内容的角色/权限条目数保持在较小的范围内。

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

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

s、 a.维基百科上的RBAC

 类似资料:
  • 我正在为访问控制系统设计一个数据库模型,该系统部分基于角色,但需要一些访问列表功能和关系访问。 我正在为一所学校构建一个web应用程序(如果需要的话,可以使用PHP和MVC体系结构),用于管理学生、教师、员工和管理者之间的互动,例如教师奖励学生,或者其中一名员工招收或开除学生。我的主要问题是,我被要求:1-为每个用户提供可选的额外权限,而不是他们已经从角色继承的权限。(= 走这条路对吗?我应该为每

  • 问题内容: 是否可以使用任何基于角色的开源访问控制系统? 问题答案: 布兰登·萨维奇(Brandon Savage)在他的PHP软件包“ ApplicationACL ” 上做了一个演示,该演示可能会或可能不会完成基于角色的访问。PHPGACL可能也能正常工作,但是我不能肯定地告诉您。 但是,我可以告诉您的是Zend Framework 的Zend_ACL组件将执行基于角色的设置(但是您必须子类化

  • 角色定义 [role_definition] 是RBAC角色继承关系的定义。 Casbin 支持 RBAC 系统的多个实例, 例如, 用户可以具有角色及其继承关系, 资源也可以具有角色及其继承关系。 这两个 RBAC 系统不会互相干扰。 此部分是可选的。 如果在模型中不使用 RBAC 角色, 则省略此部分。 [role_definition] g = _, _ g2 = _, _ 上述角色定义表

  • 在我工作的公司,我们计划更新和重新编码我们12年的在线销售网络应用程序。 我们的客流量有点高;每天超过10万个销售订单意味着在web应用程序上每天至少有100万个交互。 我想用NodeJS作为web服务器,集成到我们的ERP系统中,运行在Oracle Exadata数据库上。 我的问题是:性能对我们来说是非常非常关键的,我不确定NodeJS的可伸缩性是否足以应付如此高的事务数。 我在网上读了一些博

  • 我知道在基于角色的访问控制系统(RBAC)中,组织内的角色由角色表示。然后,每个角色都包含不同的任务(访问权限),以便在应用程序中执行操作。然后,根据其工作职责,为组织中的每个用户分配一个或多个角色。 我不明白的是RBAC中是否存在组。我目前正在设计一个系统,用户可以被分配一个或多个角色。然后,用户可以被放入1个或多个组(例如,程序员、12楼的人、穿金属t恤的人、国际象棋俱乐部的成员等),但这些组

  • 以下内容是 xingzhou 对 kubernetes 官方文档的翻译,原文地址 https://k8smeetup.github.io/docs/admin/authorization/rbac/ 基于角色的访问控制(Role-Based Access Control, 即”RBAC”)使用”rbac.authorization.k8s.io” API Group实现授权决策,允许管理员通过Ku