在 OPA rego 中使用 OR 条件
Using OR condition in OPA rego
我想对以下内容执行 OR 操作,其中我的 arr 计数不等于 0 并且我的电子邮件不包含“test.com”,但是我的规则产生错误,任何非常感谢帮助如何在一行中改进它!提前谢谢你
any([count(arr) != 0, not contains(email, "test.com")])
not
关键字有点特殊,因为它不能在许多上下文中使用,例如示例的数组。我相信这可以在 OPA 中得到改进,但在那之前你可以在大多数情况下轻松避免它,就像你提供的那样:
any([count(arr) != 0, contains(email, "test.com") == false])
更一般地说,Rego 不允许在同一函数中使用 OR-ing 语句。使用 any()
适用于简单的情况,但对于复杂的情况可能会变得笨拙,因此它被认为是一种反模式。
相反,Rego 使用 incremental rules,其中每个规则 中的每个语句 都进行 AND 运算,同名规则进行 OR 运算。
考虑以下 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
的请求将始终被允许。
我想对以下内容执行 OR 操作,其中我的 arr 计数不等于 0 并且我的电子邮件不包含“test.com”,但是我的规则产生错误,任何非常感谢帮助如何在一行中改进它!提前谢谢你
any([count(arr) != 0, not contains(email, "test.com")])
not
关键字有点特殊,因为它不能在许多上下文中使用,例如示例的数组。我相信这可以在 OPA 中得到改进,但在那之前你可以在大多数情况下轻松避免它,就像你提供的那样:
any([count(arr) != 0, contains(email, "test.com") == false])
更一般地说,Rego 不允许在同一函数中使用 OR-ing 语句。使用 any()
适用于简单的情况,但对于复杂的情况可能会变得笨拙,因此它被认为是一种反模式。
相反,Rego 使用 incremental rules,其中每个规则 中的每个语句 都进行 AND 运算,同名规则进行 OR 运算。
考虑以下 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
的请求将始终被允许。