1

我遵循了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))
...

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

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

谢谢!

4

1 回答 1

3

你看过文档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))

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

于 2021-10-08T07:50:06.003 回答