【问题标题】:How to get keys from a Rego table?如何从 Rego 表中获取密钥?
【发布时间】:2019-12-05 07:48:03
【问题描述】:

假设我有数据:

> data
{
   "teams": {
      "t1": {
         "count": 1
      },
      "t2": {
          "count": 2
      }
   }
}

输入是这样的:

{
   "input": {"team": "t1"}
}

我想要一个规则来检查输入团队是否存在:

team_exists {
  data.teams[_] == input.name # this doesn't work, because data.teams[_] returns team values
}

怎么办?

【问题讨论】:

    标签: open-policy-agent


    【解决方案1】:

    您可以像这样检查团队是否包含在对象中:

    data.teams[input.team]
    

    在你原来的例子中,你写了data.teams[_] == input.name。这有两个问题:

    1. 当您将变量(_ 是像 Go 一样的唯一变量)插入到引用中时,OPA 会查找对使查询为真的变量的赋值,即,它将扫描数组/引用/对象并查找匹配项。如果您给变量命名,这会变得更加明显:
    some key
    data.teams[key]
    

    在这个查询中,OPA 会找到两个“key”的结果:

    # Result 1
    key = "t1"
    
    # Result 2
    key = "t2"
    
    1. RHS 应该是 input.team 而不是 input.name。后者缺失/未定义。如果您改为编写 data.teams[input.name](注意:不正确的 input 引用)查询将未定义,因为 input.name 不存在。

    通常,您可以使用相同的语法对对象、数组和集合执行查找:

    some_arr := ["foo", "bar", "baz"]
    some_arr[1] == "bar"
    
    some_obj := {"foo": "bar", "baz", "qux"}
    some_obj["baz"] == "qux"
    
    some_set := {"foo", "bar", "baz"}
    some_set["bar"] == "bar" # sets behave like objects where the keys==values
    

    其他常见操作见此备忘单:https://www.openpolicyagent.org/docs/latest/policy-cheatsheet/

    【讨论】:

      猜你喜欢
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多