开放策略代理满足所有数组项的条件
Open policy agent satisfy condition for all array items
我想暂时解决这个问题 - 我有一个包含数组的 JSON 输入,可以这样说:
{
"array" : [
{"foo": "bar"},
{"foo": "buzz"},
{"misbehaving": "object"}
]
}
我的目标是验证数组中的所有对象是否满足具有名为 foo 的字段的条件(实际用例是确保云部署中的所有资源都有标签)。我的问题是标准 rego 表达式被评估为 "at least" 而不是 "all",这意味着表达式如:
all_have_foo_field {
input.array.foo
}
总是返回 true,即使有些对象不满足这一点。我查看了 ,但是在评估正则表达式 returns true
或 false
时,我的策略会检查字段是否存在,这意味着如果不存在,我会得到 'var_is_unsafe'错误。
有什么想法吗?
有两种说法"all fields of elements in X must match these conditions"(FOR ALL)。
TLDR:
all_have_foo_field {
# use negation and a helper rule
not any_missing_foo_field
}
any_missing_foo_field {
some i
input.array[i]
not input.array[i].foo
}
或
all_have_foo_field {
# use a comprehension
having_foo := {i | input.array[i].foo}
count(having_foo) == count(input.array)
}
方法取决于美国的情况。如果你想知道哪些元素不满足条件,理解很好,因为你可以使用集合算法,例如,{i | input.array[i]} - {i | input.array[i].foo}
产生不具有字段 "foo" 的数组索引集。您可能希望将这些表达式分配给局部变量以提高可读性。有关详细信息,请参阅文档中的此部分:https://www.openpolicyagent.org/docs/latest/policy-language/#universal-quantification-for-all.
在这种情况下(与您链接到的答案相反)我们不必使用正则表达式或类似的东西,因为 对 missing/undefined 字段的引用导致未定义 和 undefined 向外传播到表达式、查询、规则等。Introduction.
在一定程度上涵盖了这一点
然后我们所要做的就是参考相关字段。请注意,从技术上讲,如果 "foo" 字段值 false
则 not input.array[i].foo
将为真,但在许多情况下未定义且 false
可以视为可互换的(它们并不完全相同 - -false
是有效的 JSON 值,而 undefined 表示缺少值。)如果您只需要匹配 undefined ,则必须将引用的结果分配给局部变量。在理解的情况下我们可以写:
# the set will contain all values i where field "foo" exists regardless
{i | _ = input.array[i].foo}
在否定的情况下,我们需要一个额外的辅助规则,因为 not _ = input.array[i].foo
将是 "unsafe"。我们可以这样写:
exists(value, key) { value[key] = _ }`
现在 not exists(input[i], "foo")
仅在字段 "foo" 缺失时为真。
请注意,区分 undefined 和 false
通常是不值得的——我建议只在必要时才这样做。
我想暂时解决这个问题 - 我有一个包含数组的 JSON 输入,可以这样说:
{
"array" : [
{"foo": "bar"},
{"foo": "buzz"},
{"misbehaving": "object"}
]
}
我的目标是验证数组中的所有对象是否满足具有名为 foo 的字段的条件(实际用例是确保云部署中的所有资源都有标签)。我的问题是标准 rego 表达式被评估为 "at least" 而不是 "all",这意味着表达式如:
all_have_foo_field {
input.array.foo
}
总是返回 true,即使有些对象不满足这一点。我查看了 true
或 false
时,我的策略会检查字段是否存在,这意味着如果不存在,我会得到 'var_is_unsafe'错误。
有什么想法吗?
有两种说法"all fields of elements in X must match these conditions"(FOR ALL)。
TLDR:
all_have_foo_field {
# use negation and a helper rule
not any_missing_foo_field
}
any_missing_foo_field {
some i
input.array[i]
not input.array[i].foo
}
或
all_have_foo_field {
# use a comprehension
having_foo := {i | input.array[i].foo}
count(having_foo) == count(input.array)
}
方法取决于美国的情况。如果你想知道哪些元素不满足条件,理解很好,因为你可以使用集合算法,例如,{i | input.array[i]} - {i | input.array[i].foo}
产生不具有字段 "foo" 的数组索引集。您可能希望将这些表达式分配给局部变量以提高可读性。有关详细信息,请参阅文档中的此部分:https://www.openpolicyagent.org/docs/latest/policy-language/#universal-quantification-for-all.
在这种情况下(与您链接到的答案相反)我们不必使用正则表达式或类似的东西,因为 对 missing/undefined 字段的引用导致未定义 和 undefined 向外传播到表达式、查询、规则等。Introduction.
在一定程度上涵盖了这一点然后我们所要做的就是参考相关字段。请注意,从技术上讲,如果 "foo" 字段值 false
则 not input.array[i].foo
将为真,但在许多情况下未定义且 false
可以视为可互换的(它们并不完全相同 - -false
是有效的 JSON 值,而 undefined 表示缺少值。)如果您只需要匹配 undefined ,则必须将引用的结果分配给局部变量。在理解的情况下我们可以写:
# the set will contain all values i where field "foo" exists regardless
{i | _ = input.array[i].foo}
在否定的情况下,我们需要一个额外的辅助规则,因为 not _ = input.array[i].foo
将是 "unsafe"。我们可以这样写:
exists(value, key) { value[key] = _ }`
现在 not exists(input[i], "foo")
仅在字段 "foo" 缺失时为真。
请注意,区分 undefined 和 false
通常是不值得的——我建议只在必要时才这样做。