繁体   English   中英

在 OPA rego 中使用 OR 条件

[英]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规则。 简而言之,如果至少满足以下条件之一,我们将拒绝该请求:

  1. 用户不是管理员,或者
  2. 今天是星期日。
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM