我正在尝试决定为项目做哪些授权技术/方法,而 XACML 有很多有趣的功能。不过,我无法理解的一件事是需要组合算法。是否存在需要它们的复杂场景?
说,相反,对资源类型(或其他)的访问默认是允许或拒绝。规则定义了允许或拒绝(从不同时)的条件。
如果有任何拒绝,它就会被拒绝(立即)。如果它是“默认拒绝”并且没有许可,它也被拒绝。规则可以具有优先级,并且任何更高级别的允许/拒绝将覆盖低于它的那些。
规则将是更零碎的允许/拒绝,而不是具有高级组合算法的一条大规则。
我是否错过了这种方法无法涵盖的一些主要场景(可能)?也许是一个很难回答的问题 :) 希望有很多 XACML 经验和/或访问控制的人可以对设计思维和他们对此类政策的经验有所了解。
提前致谢!
编辑:(作为对乔治的回复,因为太长了)
非常感谢您回答大卫!读了很多你的帖子和文章,好东西。
我听到你在说什么,并且有很多错综复杂的东西(阅读一些设计决策和评估逻辑的电子邮件列表,哇,毛茸茸的东西:) 但似乎层次结构增加了很多复杂性,我不太明白为什么需要它。
根据我写的逻辑,我可以只有这两个规则(如果我正确理解 XACML)
PERMIT: unit = "bu1"
DENY: unit = "bu1" AND apiPath == "/finance" AND objectType== "trade" AND trade.amount > user.allowedAmount
- 如果用户在单元中,则授予访问权限
- 在一组特定情况下否认
- 如果它是全公司范围的规则,甚至可以取消 DENY 规则的业务部门限制,这似乎应该是
单独定制规则似乎比将它们作为一条大规则的一部分更容易,如果你这样编写它们,真的需要将它们视为一条规则吗?我想你会有一种允许一般情况并否认例外的一般心态。
所以第二个示例,这就是为什么我认为您实际上需要“优先级”来解决某些问题。
Priority 1:
PERMIT: megaemergency = true
Priority 2:
PERMIT: emergency = true AND u.approvalLimit >= c.amount.
Priority 3:
PERMIT: u.region = c.region AND u.approvalLimit >= c.amount.
由于它在任何“优先级”上的 PERMIT 或 DENY 上短路,并且按顺序对其进行评估,结果不一样吗?编写低优先级规则的人实际上并不需要了解具有更高优先级的规则。
最后一个例子是:
PERMIT: u.citizenship == "U.S" AND u.enteringFrom == "Canada"
DENY: u.citizenship != "U.S" AND u.enteringFrom == "Canada"
(我的意思是也必须有其他规则:)
由于 DENY 会覆盖 Permit,因此任何 DENY 都会拒绝您的设置。
我想我很难看到这种方法无法处理的边缘情况......也许我有一个头放屁:)
再次抱歉,问题的范围有点宽。