0

我试图根据触发该规则的条件返回 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 条件,但它给出了上述错误。关于如何实施的任何想法?

4

1 回答 1

2

您可以利用具有增量定义的规则来实施您的策略。例如,

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", "b": "C", "c": 3, "d": 55, "e": 1 }allow规则将返回

{
    "field": [
        "OptionalRule1"
    ]
}
于 2021-01-07T01:39:58.013 回答