如何根据开放策略代理 (OPA) 中的 OR 条件返回响应对象获取错误完整规则一定不能产生多个输出吗?

问题描述

我试图根据触发该规则的条件返回 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"
    ]
}