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