【问题标题】:Assert that every string in a set has an associated key in an object断言集合中的每个字符串在对象中都有一个关联的键
【发布时间】:2021-04-13 09:43:07
【问题描述】:

在阅读了几次 Open Policy Agent 介绍文档之后,我在编写一条规则时遇到了麻烦,该规则断言对于集合中的每个元素,指定的对象都有一个关联的键。

这是我目前正在尝试的一个简化示例

https://play.openpolicyagent.org/p/oWBumjRkWX

package example

my_object = {
  "lemon": ""
}

fruits = {
  "orange",
  "lemon",
  "banana"
}

has_key(x, k) { _ = x[k] }

default has_lemon = false
has_lemon = has_key(my_object, "lemon") # this works as you'd expect

default all_fruits_have_entries_in_my_object = false
all_fruits_have_entries_in_my_object { # this is never false for some reason
  some fruit
  fruits[fruit]
  has_key(my_object, fruit) # each fruit have a key in the my_object object
}

据我了解,fruits 不包含 "lemon" 元素时,has_lemon 应该为 false,并且我已经测试过它是否有效。但是,我还认为all_fruits_have_entries_in_my_object 规则应该在这里评估为false,因为my_object 缺少"orange""banana" 的键。我在这里做傻事吗?

【问题讨论】:

    标签: open-policy-agent rego


    【解决方案1】:

    Rego 是存在量化的。这意味着声明规则来检查是否存在作为对象键的一些水果。

    解决问题的一种方法:您可以先使用推导式收集所有意外的键,然后计算结果:

    package example
    
    my_object = {
      "lemon": ""
    }
    
    fruits = {
      "orange",
      "lemon",
      "banana"
    }
    
    has_key(x, k) { _ = x[k] }
    
    default has_lemon = false
    has_lemon = has_key(my_object, "lemon") # this works as you'd expect
    
    default all_fruits_have_entries_in_my_object = false
    all_fruits_have_entries_in_my_object { # this is never false for some reason
      non_fruit_keys := { key | my_object[key]; !fruits[key] }
      count(non_fruit_keys) > 0
    }
    

    您可以在Rego Playground 中评估此示例。

    另请参阅Universal Quantification in Rego 上的文档

    【讨论】:

    • 感谢您指出该文档。我使用default some_fruits_dont_have_entries_in_my_object = false some_fruits_dont_have_entries_in_my_object { some fruit fruits[fruit] not has_key(my_object, fruit) } not some_fruits_dont_have_entries_in_my_object # this does what I need 让它工作了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多