我想对以下内容进行 OR 操作,其中我的 arr 计数不等于 0,并且我的电子邮件不包含“test.com”,但是我的规则正在产生错误,有关如何改进它的任何帮助一行非常感谢!先感谢您
any([count(arr) != 0, not contains(email, "test.com")])
我想对以下内容进行 OR 操作,其中我的 arr 计数不等于 0,并且我的电子邮件不包含“test.com”,但是我的规则正在产生错误,有关如何改进它的任何帮助一行非常感谢!先感谢您
any([count(arr) != 0, not contains(email, "test.com")])
更一般地说,Rego 不允许在同一个函数中使用 OR-ing 语句。Usingany()
对于简单的情况很有效,但对于复杂的情况可能会变得笨拙,因此它被认为是一种反模式。
相反,Rego 使用增量规则,其中每个 Rule中的每个语句都被 AND-ed 在一起,并且同名的规则被 OR-ed 在一起。
考虑以下deny
规则。简而言之,如果至少满足以下条件之一,我们将拒绝该请求:
deny {
input.role != "admin"
}
deny {
time.weekday(time.now_ns()) == "Sunday"
}
admin
这将只允许在星期日以外的日子对角色提出请求。相反,如果我们说:
deny {
input.role != "admin"
time.weekday(time.now_ns()) == "Sunday"
}
然后,我们只会admin
在周日拒绝来自非角色的请求。来自的请求admin
总是被允许的。
该not
关键字有点特殊,因为它不能在许多上下文中使用,例如您的示例数组。我相信这可以在 OPA 中得到改进,但在此之前,您可以在大多数情况下轻松避免它,就像您提供的那样:
any([count(arr) != 0, contains(email, "test.com") == false])