Authentication 可扩展的基于角色的身份验证

Authentication 可扩展的基于角色的身份验证,authentication,scalable,role-based,Authentication,Scalable,Role Based,我目前正在为许多用户拥有不同访问权限的资源设计一个基于角色的身份验证系统 一个角色可以是单个用户,也可以是一组角色(因此,一个角色是一个角色树)。(见下图) 一个资源可以有多个身份验证属性(如读、写、删除),其中每个属性都是允许访问操作的角色列表。(见下图) 问题是,如果我想检查用户是否有权访问某个属性,我必须在最坏的情况下遍历n棵树(其中n是分配给属性的角色数) 例如,要检查“Max”是否可以读取属性,我可能必须检查营销、管理和管理树是否包含“Max” 您知道有什么算法或替代方法可以在维

我目前正在为许多用户拥有不同访问权限的资源设计一个基于角色的身份验证系统

一个角色可以是单个用户,也可以是一组角色(因此,一个角色是一个角色树)。(见下图)

一个资源可以有多个身份验证属性(如读、写、删除),其中每个属性都是允许访问操作的角色列表。(见下图)

问题是,如果我想检查用户是否有权访问某个属性,我必须在最坏的情况下遍历n棵树(其中n是分配给属性的角色数)

例如,要检查“Max”是否可以读取属性,我可能必须检查营销、管理和管理树是否包含“Max”


您知道有什么算法或替代方法可以在维护角色系统或其他同样强大的功能的同时删除非常昂贵的树搜索

最理想的情况是对n个角色进行类似O(log(n))的查找

谢谢,
Fionn

如果将角色放在SQL数据库中,则查找的执行情况将与您描述的基本相同。如果您感兴趣,我可以帮助您了解数据库结构。

您需要反转指针

“Harry”是“Site2管理员”的成员,该“管理员”可以访问“Site2”,因此他可以“删除”、“写入”和“读取”该内容


为什么“管理”应该是“Harry”和“Joe”之间的共同点我不清楚。Harry在一个站点上是管理员,但在另一个站点上只是用户,Joe在另一个站点上也是用户。

您是否衡量过这一点,并确定此遍历是性能瓶颈

我从未见过一个系统有如此多的角色/级别,以至于遍历这种结构的成本会成为一个问题。如果树真的那么大,我更担心的是管理员会难以理解谁有权做什么

关于可伸缩性,我通常会使用ASP.NET缓存来缓存资源和角色之间映射的完整树,并使用适当的缓存超时。并且单独缓存从用户到角色的映射(例如,在会话中或使用ASP.NET缓存中的用户特定键)


与每次访问数据库相比,从缓存中访问信息的速度通常会非常快。

SQL数据库不会真正消除树遍历的复杂性,相反,在我看来,SQL中的树是相当痛苦的。角色的深度实际上并没有限制。“嵌套集”模型是一种在SQL中快速选择子树。有一个很好的变化,这将在Bigtable这样的数据库系统上运行-没有连接,只有普通的表。即使嵌套集很快,我想它的伸缩性也不会很好,因为它远不是标准的表查找。不,嵌套集方法使用标准SQL。它使用的模式使N分区很慢,但选择速度很快:它甚至不需要联接,更不用说递归联接了。没有规则说管理员可以做任何事情,它可以被命名为SomeUsers角色,如果有人可以读、写或其他完全取决于是否将包含该用户的角色添加到属性中。据我所知,y我们对功能需求/规范的描述包括树。因此,您需要更改规范,或者找到一种方法来防止树搜索“非常昂贵”。