1

我是 OPA/Rego 的新手,很难理解这里的问题到底是什么:https ://play.openpolicyagent.org/p/h08NbfmF4j

我希望有与该*类别相关联的团队,我希望accessible[team]规则返回所有现有类别。如果团队分配了特定类别,则应仅返回该类别。

要求真的很简单,但我不知道为什么会出现“eval_conflict_error:对象键必须是唯一的”错误。

4

3 回答 3

1

错误的原因是第二个策略:

cats[team] = category {
  data.teams[team]
  data.teams[team].category == "*"
  category := data.categories[_]
}

错误来自最后一行。当您使用“[_]”时,“幕后”发生的事情是,您的策略对于您迭代的每个对象都是重复的。例如,在您的情况下(根据您的输入),您的策略与编写以下内容相同:

cats[team] = category {
  data.teams[team]
  data.teams[team].category == "*"
  category := data.categories["x"]
}

cats[team] = category {
  data.teams[team]
  data.teams[team].category == "*"
  category := data.categories["y"]
}

cats[team] = category {
  data.teams[team]
  data.teams[team].category == "*"
  category := data.categories["z"]
}

所以这就是发生的事情:在“teams”对象中,唯一符合您的条件的对象(类别是'*')是具有“c”键的对象。然后,对于这些规则中的每一个,您构建一个对象,其中键是“c”,值是当前类别。意思是结果如下:

"cats": {
    "c": {
            "foo": 1
        },
    "c": {
            "foo": 2
        },
    "c": {
            "bar": 3
        }
}

现在这会导致错误,因为您在“cats”对象中多次拥有相同的键(“c”),具有不同的值,并且“对象键必须是唯一的”。

于 2022-03-01T22:06:48.270 回答
0

虽然我不能真正理解为什么最初的方法不起作用,但我设法让它在这部剧中起作用

据我了解,第一cats条规则无法证明c(因此没有结果),而第二cats条规则可以证明每个现有类别(并且只应迭代一次)。我希望 Rego 返回category证明第二条规则为真的所有可能值(即所有data.category键)。最后,来自第一条和第二条规则的集合将被连接在一起。

看起来这正是它的工作原理,但也许我的初始语法错误?

如果有人可以评论为什么原始代码中的键发生冲突,我很乐意将详细信息添加到这个答案中。

于 2021-04-13T12:56:00.640 回答
-1

是您的政策的修改版本。该错误是由为 team 生成的值引起的c。在您的策略中,data.categories[_]表达式将迭代类别映射中的值,并导致与规则中已为键设置的结果发生c冲突cats。您需要返回密钥集合,c如修改后的策略中所示。

于 2021-04-12T22:01:37.673 回答