OPA (Rego) 作为 Go lib:如何应用外部数据?

bog*_*ogg 2 go open-policy-agent rego

我按照https://www.openpolicyagent.org/docs/latest/#5-try-opa-as-a-go-library的示例进行操作。重要代码片段:

r := rego.New(
rego.Query("x = data.example.allow"),
rego.Load([]string{"./example.rego"}, nil)
...
rs, err := query.Eval(ctx, rego.EvalInput(input))
...
Run Code Online (Sandbox Code Playgroud)

如何添加外部数据 ( data.json) 以便我可以data.wantedName在 rego 策略中使用它来访问它?

我尝试通读 go 文档和示例,但找不到任何有用的信息。

谢谢!

sr_*_*sr_ 7

您看过有关rego.Store()示例的文档吗?

对于简单的情况,沿着这些思路的东西应该可以解决问题:

    data := `{
        "example": {
            "users": [
                {
                    "name": "alice",
                    "likes": ["dogs", "clouds"]
                },
                {
                    "name": "bob",
                    "likes": ["pizza", "cats"]
                }
            ]
        }
    }`

    var json map[string]interface{}

    err := util.UnmarshalJSON([]byte(data), &json)
    if err != nil {
        // Handle error.
    }

    store := inmem.NewFromObject(json)

    // Create new query that returns the value
    rego := rego.New(
        rego.Query("data.example.users[0].likes"),
        rego.Store(store))
Run Code Online (Sandbox Code Playgroud)

您可以实现自己的存储以用于更复杂的用途,但这会涉及更多内容。如果您可以将inmem.NewFromObject()商店喂入rego.New(),那么您应该首先尝试一下。

  • 除了这个答案之外,人们可能还想查看新的 SDK:https://blog.styra.com/blog/the-open-policy-agent-sdk-overview (2认同)