首先,让我们退后一步,刷新我们的记忆。 XACML 中有 3 个结构元素:
-
PolicySet 可以包含PolicySet 和Policy 元素
-
Policy 可以包含 Rule 元素。
-
Rule 包含所需的效果(Permit 或 Deny)。
Rule 包含 Target 元素和 Condition 元素,它们定义了规则何时应用。
仅当Target 和Condition 评估为真,即Target 中的所有匹配项都正确且Condition 的所有部分最终评估时,Rule 才会应用并返回其效果为真。
让我们举个例子:
- 规则 1:如果 current-time>1pm and current-time
ALFA 中的代码是:
policy parent{
apply firstApplicable
rule example{
permit
condition currentTime>"13:00:00":time &&
currentTime<"18:00:00":time &&
currentDate=="2015-07-23":date
}
}
如果条件中的所有匹配项都评估为真,则该规则将仅适用并仅返回其效果,在这种情况下为许可。
如果我们用两条规则来表达相同的逻辑呢?那会发生什么?让我们将条件拆分为 2 个规则:
policy parent{
apply firstApplicable
rule checkTime{
permit
condition currentTime>"13:00:00":time &&
currentTime<"18:00:00":time
}
rule checkDate{
permit
condition currentDate=="2015-07-23":date
}
}
然后会发生什么?结果不一样。事实上,如果一个策略有 2 个子规则,它如何确定要考虑哪一个?这就是combining algorithms 介入的地方。在策略级别和策略集级别定义组合算法。见here for a full list and details。
在上面的例子中,我们使用了
apply firstApplicable
这意味着如果规则说允许,那么甚至不会考虑对第二个规则进行评估。换句话说,不会检查日期约束。因此,这2条规则的集合并不等同于我们写的原始条件。
我们仍然可以修改这 2 条规则,使它们确实像条件一样工作 - 或几乎一样。一种这样的方法是扭转检查并使规则成为否定规则:如果时间超出 1-6 范围,则拒绝。如果日期是“2015-07-23”,则拒绝。只有这样才能定义允许访问的许可规则。重做的例子变成了 ALFA:
policy parent{
apply firstApplicable
rule checkTime{
deny
condition currentTime<="13:00:00":time ||
currentTime>="18:00:00":time
}
rule checkDate{
deny
condition not(currentDate=="2015-07-23":date)
}
rule allowAccess{
permit
}
}
不过,底线是:你想表达什么?区分时间检查和日期检查是否重要?作为2条规则更有意义吗?单一规则?这完全取决于您。
要编辑示例策略,您可以下载ALFA plugin from here。
HTH