如何为 XACML 的规则组合做逻辑与
How to do logical AND for Rule combining for XACML
我的情况是我有一个包含多个规则的策略,所有规则都必须为真才能使策略为真。例如:
Policy A
- Rule 1
- Rule 2
- Rule 3
为了 Policy A
适用,我需要所有三个规则都 return 为真,如果其中一个 return 为假,它应该去检查我的其他政策政策集
我现在拥有的是
<!-- shortened for brevity -->
<Policy RuleCombiningAlgId="...:deny-overrides">
<Rule id="1" Effect="Permit">
...
</Rule>
<Rule id="2" Effect="Permit">
...
</Rule>
<Rule id="3" Effect="Permit">
...
</Rule>
</Policy>
我认为我的问题是我的规则 none return "Deny" 但我最初认为如果不允许,则应该拒绝。我想在我的所有规则中加上一个 not ,但这会使它变得不优雅。
如果相关,我正在使用 Authzforce 库。
all the rules need to be true for the policy to be true
就 XACML 而言,我猜您的意思是:当且仅当 return 中的所有规则都允许时,策略必须 return 允许。我想不出 XACML 标准中有任何规则组合算法可以简单地做到这一点。所以我建议两个选项:
选项 A:将每个规则包装在 deny-unless-permit 策略中,并在顶部使用 permit-unless-deny -级别(策略 A 成为策略集 A)。
<?xml version="1.0" encoding="utf-8"?>
<PolicySet PolicySetId="A" PolicyCombiningAlgId="...:permit-unless-deny">
<Policy RuleCombiningAlgId="...:deny-unless-permit">
<Rule id="1" Effect="Permit">
...
</Rule>
</Policy>
<Policy RuleCombiningAlgId="...:deny-unless-permit">
<Rule id="2" Effect="Permit">
...
</Rule>
</Policy>
<Policy RuleCombiningAlgId="...:deny-unless-permit">
<Rule id="3" Effect="Permit">
...
</Rule>
</Policy>
</PolicySet>
在这种情况下,PolicySet A returns 允许当且仅当 (iff) 没有策略 returns 拒绝(根据允许的定义-除非拒绝算法)。由于每个策略 returns 允许当且仅当规则 returns 允许,否则拒绝(根据 deny-unless-permit 算法的定义),这等同于:
策略 A returns 允许当且仅当所有策略 return 允许,即当且仅当所有规则 return 允许。
我的情况是我有一个包含多个规则的策略,所有规则都必须为真才能使策略为真。例如:
Policy A
- Rule 1
- Rule 2
- Rule 3
为了 Policy A
适用,我需要所有三个规则都 return 为真,如果其中一个 return 为假,它应该去检查我的其他政策政策集
我现在拥有的是
<!-- shortened for brevity -->
<Policy RuleCombiningAlgId="...:deny-overrides">
<Rule id="1" Effect="Permit">
...
</Rule>
<Rule id="2" Effect="Permit">
...
</Rule>
<Rule id="3" Effect="Permit">
...
</Rule>
</Policy>
我认为我的问题是我的规则 none return "Deny" 但我最初认为如果不允许,则应该拒绝。我想在我的所有规则中加上一个 not ,但这会使它变得不优雅。
如果相关,我正在使用 Authzforce 库。
all the rules need to be true for the policy to be true
就 XACML 而言,我猜您的意思是:当且仅当 return 中的所有规则都允许时,策略必须 return 允许。我想不出 XACML 标准中有任何规则组合算法可以简单地做到这一点。所以我建议两个选项:
选项 A:将每个规则包装在 deny-unless-permit 策略中,并在顶部使用 permit-unless-deny -级别(策略 A 成为策略集 A)。
<?xml version="1.0" encoding="utf-8"?>
<PolicySet PolicySetId="A" PolicyCombiningAlgId="...:permit-unless-deny">
<Policy RuleCombiningAlgId="...:deny-unless-permit">
<Rule id="1" Effect="Permit">
...
</Rule>
</Policy>
<Policy RuleCombiningAlgId="...:deny-unless-permit">
<Rule id="2" Effect="Permit">
...
</Rule>
</Policy>
<Policy RuleCombiningAlgId="...:deny-unless-permit">
<Rule id="3" Effect="Permit">
...
</Rule>
</Policy>
</PolicySet>
在这种情况下,PolicySet A returns 允许当且仅当 (iff) 没有策略 returns 拒绝(根据允许的定义-除非拒绝算法)。由于每个策略 returns 允许当且仅当规则 returns 允许,否则拒绝(根据 deny-unless-permit 算法的定义),这等同于: 策略 A returns 允许当且仅当所有策略 return 允许,即当且仅当所有规则 return 允许。