# #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, как если бы вы запускались из командной строки, с файлом конфигурации и всем прочим 🙂