我目前正在为许多用户拥有不同访问权限的资源设计基于角色的身份验证系统。
角色可以是单个用户,也可以是一组角色(因此角色是角色树)。 (见下图)
资源可以具有多个身份验证属性(如读取,写入,删除),其中每个属性都是允许访问操作的角色列表。 (见下图)
问题是如果我想检查用户是否有权访问属性,我必须在最坏的情况下遍历n个树(其中n是分配给属性的角色数)。
例如,检查'Max'是否可以读取我可能必须检查营销,管理和管理树的属性,如果它们包含'Max'。
您是否知道任何算法或替代方法可以在维护角色系统或类似功能的同时删除相当昂贵的树搜索。
完美的情况是对n个角色进行一些像O(log(n))的查找。
谢谢, 菲昂
答案 0 :(得分:2)
您是否对此进行了测量并确定此遍历是性能瓶颈?
我从未见过如此多的角色/级别的系统,以至于遍历这种结构的成本将成为一个问题。如果树真的那么大,我会更担心管理员很难理解谁有权做什么。
关于可伸缩性,我通常使用ASP.NET缓存来缓存在资源和角色之间映射的完整树,以及适当的缓存超时。并单独缓存从用户到角色的映射(例如,在Session中或使用ASP.NET缓存中的用户特定键)。
与每次访问数据库相比,从缓存中访问信息通常会非常快。
答案 1 :(得分:0)
如果将角色放在SQL数据库中,查找将按照您的描述执行。如果您有兴趣,我可以帮助您了解数据库结构。
答案 2 :(得分:0)
你需要反转你的指针。
“Harry”是“Site2 Admins”的成员,其“管理员”访问“Site2”,因此他可以“删除”,“写入”和“阅读该内容。
为什么“管理”应该是“哈利”和“乔”之间的共同点我不清楚。 Harry是一个站点的管理员,但只是另一个站点的用户,而Joe则反之亦然。