jrc*_*hew 6 open-policy-agent rego
我想使用 OR 运算来组合以下条件:
arr不等于0email不包含"test.com"目前我正在使用内置函数any():
any([count(arr) != 0, not contains(email, "test.com")])
Run Code Online (Sandbox Code Playgroud)
然而我的规则产生了错误。
我怎样才能一次性实现并改进这一目标?
更一般地说,Rego 不允许在同一函数中使用 OR 语句。使用any()对于简单的情况效果很好,但对于复杂的情况可能会变得笨拙,因此它被认为是反模式。
相反,Rego 使用增量规则,其中每个规则中的每个语句都通过 AND 组合在一起,并且相同名称的规则通过 OR 组合在一起。
考虑以下deny规则。简而言之,它表示如果至少出现以下情况之一,我们将拒绝该请求:
deny {
input.role != "admin"
}
deny {
time.weekday(time.now_ns()) == "Sunday"
}
Run Code Online (Sandbox Code Playgroud)
admin这将只允许在周日以外的日子对该角色提出请求。如果我们说:
deny {
input.role != "admin"
time.weekday(time.now_ns()) == "Sunday"
}
Run Code Online (Sandbox Code Playgroud)
然后我们只会admin在周日拒绝非角色的请求。来自的请求admin总是被允许的。
该not关键字有点特殊,因为它不能在许多上下文中使用,例如示例的数组。我相信这可以在 OPA 中得到改进,但在那之前您在大多数情况下都可以轻松避免它,就像您提供的那样:
any([count(arr) != 0, contains(email, "test.com") == false])
Run Code Online (Sandbox Code Playgroud)