权限处理的模式/设计建议

10
我们在我们的(ASP.NET Web)应用程序中有一个相当复杂的权限处理系统。用户可以在不同类型的对象上拥有特定的权限,有些权限甚至被打包成用户分配的组/角色。总之,这导致了一个相当复杂的混乱状态,为了确定用户是否可以执行/查看某些操作,您必须评估许多不同的权限来源,这是根据具体情况进行的。

我的问题是(从高层次的角度来看)是否有一些建议/常见的设计模式来处理权限概念,并且可能还要问一下您在处理它们的体系结构方面的经验。


1
还有在3.5中的“ASP.NET Membership”可以处理这个问题,但我不知道它对程序员友好程度如何。 - AaronLS
一个好问题,需要比下面列出的更好的答案。我正在研究Java中类似的东西,但允许继承权限。我在网上找到模式/算法方面遇到了困难。 - cs94njw
3个回答

8
我看过几个复杂的权限方案。它们总是有其合理性,但不幸的是,在某一时刻,它们都变得太复杂而无法处理,并被简化为更简单的东西。
我的个人结论是:坚持使用基于角色的访问控制(RBAC),这是每个人都能理解的唯一合理的方法。它在某种程度上受限,但对大多数情况来说足够了。
此外,使用默认拒绝策略,也就是你只授予权限。同样,我见过相反的系统(默认允许)甚至可配置默认策略(!),我认为这是不合理的。

6
拥有测试与组关联的原子权限的用户,可以使用bool UserHasPermission( SOME_PERMISSION )来进行授权,这是授权的标准方法,但现在情况正在改变,转向基于声明的授权方式: http://msdn.microsoft.com/en-us/magazine/ee335707.aspx http://msdn.microsoft.com/en-us/magazine/cc163366.aspx http://www.infoq.com/news/2009/10/Guide-Claim-Based-Identity 然而,并不是所有情况都适用于旧模型。
对于旧模型,我发现在权限检查期间使用记忆化可以提高性能。这样,我就不会在每个会话中访问数据库 n 次以检查访问控制了。记忆化有效地将具有相同参数的调用的结果存储在缓存中,因此特定用户对于检查 XYZ 权限的所有调用都将返回相同的结果。当然,您需要确保将用户的记忆化权限存储在会话中,以便它是每个用户专用的。如果您在登录时加载权限,则不需要缓存它们,但在具有许多权限的大型系统中,有时最好仅在需要时获取它们。 http://www.infoq.com/news/2007/01/CSharp-memory

2
我从未从应用程序开发的角度处理过这个问题,但通常在处理权限时,最好使用角色为对象设置权限,而不是直接向用户授予权限。如果用户需要访问特定的对象集,则不直接授予访问权限,而是给他们分配一个角色,该角色具有所需的访问权限。这在某种程度上“重复利用”了创建角色所需的工作。
然而,在代码中处理这个问题可能会变得复杂,因为您需要遍历每个用户的角色,并确定该角色是否授予用户对对象的权限。我没有任何具体的建议来处理这个问题,除了明显的尝试将这种代码因素化为自己的框架。

也许没有更好的方法,这基本上就是问题所在;) 实际上,我们有这些组和角色概念,这使得对于最终用户来说非常方便,因为他们有各种不同的配置权限的方式。问题更多地是我们的维护问题,管理所有这些不同的来源变得越来越繁琐。 - Tomas Vana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接