问题描述
我试图根据触发该规则的条件返回 OPA 策略中的响应对象,但给出错误“错误评估 policy.rego:11: eval_conflict_error: 完整的规则不能产生多个输出”,因为两个 OR 条件都被评估为真。
例如,以下是 OPA 政策示例:
package play
allow = response {
mainRule
OptionalRule
response := {
"field": OptionalRule.field
}
}
OptionalRule = resp {
input.a == "01"
input.b == "C"
resp := {
"field": "OptionalRule1"
}
}
OptionalRule = resp {
input.c != 3
resp := {
"field": "OptionalRule2"
}
}
mainRule {
input.d > 50
input.e < 5
}
使用以下输入:
{
"a": "01","b": "C","c": 4,"d": 55,"e": 1
}
在这里,我试图将 OptionalRule 实现为 OR 条件并尝试返回触发它的 optionalRule 条件,但它给出了上述错误。关于如何实现这一点有什么想法吗?
解决方法
您可以利用带有 incremental definitions 的规则来实施您的政策。例如,
package authz
allow = response {
mainRule
response := {
"field": OptionalRule
}
}
OptionalRule[resp] {
input.a == "01"
input.b == "C"
resp := "OptionalRule1"
}
OptionalRule[resp] {
input.c != 3
resp := "OptionalRule2"
}
mainRule {
input.d > 50
input.e < 5
}
现在使用像 { "a": "01","b": "C","c": 4,"d": 55,"e": 1 }
这样的输入,allow
规则将返回
{
"field": [
"OptionalRule2","OptionalRule1"
]
}
与输入 { "a": "01","c": 3,"e": 1 }
类似,allow
规则将返回
{
"field": [
"OptionalRule1"
]
}