OPA规则体中赋值(=)运算符和相等(==)运算符有什么区别

What is the difference between Assignment(=) operator and Equality(==) operator in OPA rule body

在 OPA 文档中 https://www.openpolicyagent.org/docs/latest/policy-testing/ 有如下给出的策略定义:


allow {
    input.path == ["users"]
    input.method == "POST"
}

allow {
    some profile_id
    input.path = ["users", profile_id]
    input.method == "GET"
    profile_id == input.user_id
}

第一条规则是 input.path == ["users"] 而第二条规则是 input.path = [“用户”,profile_id]。那么有人可以帮我指出这两者之间的区别吗?

Rego中的赋值运算符为:===用于比较,=运算符用于统一。有一个部分描述了差异 in the docs,但简单地说,统一结合了赋值 比较,因此在您的示例中,鉴于 input.path 有两个元素,第二个元素值将分配给 profile_id.

如果您愿意,可以编写策略来拆分比较和赋值:

allow {
    count(input.path) == 2
    input.path[0] == "users"
    profile_id := input.path[1]
    input.method == "GET"
    profile_id == input.user_id
}

可以说这有点混乱。然而,应谨慎使用合一,因为在大多数其他情况下,将赋值与比较分开会更清楚。