2009-05-25 95 views
0

我目前正在为资源设计一个基于角色的认证系统,其中许多用户对它有不同的访问权限。基于角色的可扩展认证

角色可能是单个用户或一组角色(因此角色是角色树)。 (见下图)

The other image here

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

Image goes here

的问题是,如果我要检查,如果用户具有访问财产的权利,我有在最坏的情况下(其中n是角色的数量来遍历ñ树木分配给一个财产)。

因此,例如要检查'最大'可能读取的属性,我可能必须检查市场营销,管理和行政树,如果他们包含'最大'。


你知道的任何算法或替代办法,同时保持角色系统或者同样强大从而消除了相当昂贵的树搜索。

对于n个角色,最好的情况是O(log(n))。

感谢, 菲昂

+0

就我所见,您对功能需求/规范的描述包括树。因此,无论您需要更改规格,还是想方设法防止树搜索“相当昂贵”。 – ChrisW 2009-05-26 02:36:00

回答

2

你是否测量过这个并确定这个遍历是一个性能瓶颈?

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

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

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

0

如果你把你的角色在SQL数据库中,搜索的时候会因为你描述大致执行。如果您有兴趣,我可以帮助您处理数据库结构。

+0

SQL数据库不会真正消除Tree遍历的复杂性,相反,在我看来SQL中的树是相当痛苦的。 角色的深度并不受限制。 – Fionn 2009-05-25 20:18:10

+0

'嵌套集合'模型是一种在SQL中快速选择子树的方法。 – ChrisW 2009-05-25 20:19:26

0

你需要反转你的指针。

“哈利”是“Site2的管理员”具有“管理员”访问“站点2”中的一员,所以他这样可以“删除”,“写入”和“阅读的内容。

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