OPA (Rego) как Go lib: Как применить внешние данные?

# #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))
...
 

Как я могу добавить внешние данные ( data.json ), которые я могу использовать, например, data.wantedName в политике rego для доступа к ним?

Я попытался прочитать документ go и примеры, но не смог найти никакой полезной информации.

Спасибо!

Ответ №1:

Вы видели документы 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), amp;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() , вы должны сначала попробовать это.

Комментарии:

1. В дополнение к этому ответу, возможно, захочется ознакомиться с новым SDK: blog.styra.com/blog/the-open-policy-agent-sdk-overview

2. @sr_ Да, я пробовал это, но я также загружаю политику ( rego.policy ) rego.New . Я не знаю, как объединить их обоих в rego.New одном заявлении.

3. @Devoops спасибо за эту ссылку! Когда я перешел по некоторым ссылкам в этой статье, я столкнулся с возможностью использования bundles , и теперь я вижу, что могу также использовать пакеты в библиотеке go. Я займусь этим вопросом.

4. @bogg да, это, по сути, позволяет вам запускать OPA, как если бы вы запускались из командной строки, с файлом конфигурации и всем прочим 🙂