3

我想对以下内容进行 OR 操作,其中我的 arr 计数不等于 0,并且我的电子邮件不包含“test.com”,但是我的规则正在产生错误,有关如何改进它的任何帮助一行非常感谢!先感谢您

any([count(arr) != 0, not contains(email, "test.com")])
4

2 回答 2

5

更一般地说,Rego 不允许在同一个函数中使用 OR-ing 语句。Usingany()对于简单的情况很有效,但对于复杂的情况可能会变得笨拙,因此它被认为是一种反模式。

相反,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总是被允许的。

于 2021-05-12T16:13:08.750 回答
2

not关键字有点特殊,因为它不能在许多上下文中使用,例如您的示例数组。我相信这可以在 OPA 中得到改进,但在此之前,您可以在大多数情况下轻松避免它,就像您提供的那样:

any([count(arr) != 0, contains(email, "test.com") == false])
于 2021-05-06T18:52:25.020 回答