[英]Using OR condition in OPA rego
我想对以下内容进行 OR 操作,其中我的 arr 计数不等于 0,并且我的 email 不包含“test.com”,但是我的规则正在产生错误,有关如何改进它的任何帮助一行非常感谢! 先感谢您
any([count(arr) != 0, not contains(email, "test.com")])
更一般地说,Rego 不允许在同一个 function 中使用 OR-ing 语句。 使用any()
对于简单的情况很有效,但对于复杂的情况可能会变得笨拙,因此它被认为是一种反模式。
相反,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])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.