0

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

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

另一张图在这里

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

图片在这里

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

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


您是否知道任何算法或替代方法可以删除相当昂贵的树搜索,同时保持角色系统或同样强大的东西。

完美的情况是对 n 个角色进行 O(log(n)) 之类的查找。

谢谢, 芬恩

4

3 回答 3

2

您是否对此进行了测量并确定此遍历是性能瓶颈?

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

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

与每次访问数据库相比,从缓存中访问信息通常会快得令人眼花缭乱。

于 2009-05-25T20:24:20.083 回答
0

如果您将角色放在 SQL 数据库中,查找将按照您的描述执行。如果您有兴趣,我可以帮助您了解数据库结构。

于 2009-05-25T20:10:04.043 回答
0

你需要扭转你的指针。

“Harry”是“Site2 Admins”的成员,拥有“Administrators”访问“Site2”的权限,因此他可以“删除”、“写入”和“读取该内容”。

为什么“管理”应该是“哈利”和“乔”之间的共同点,我不清楚。Harry 是一个站点的管理员,但只是另一个站点的用户,Joe 反之亦然。

于 2009-05-25T20:13:03.193 回答