TLDR; Вы можете сказать любой из них:
count(deny) == 0 with input as {"allowed":"yes"}
deny == set() with input as {"allowed":"yes"}
not deny["Must be allowed"] with input as {"allowed":"yes"}
Последний проверяет если набор не содержит указанное сообщение c. Это хорошая идея, если в одном пакете несколько правил deny
.
Оператор not deny with input as ...
завершается неудачно, поскольку ключевое слово not
инвертирует только операторы undefined / false (делая их истинными) , В этом случае deny
относится к набору значений . Набор может быть пустым, но никогда не может быть неопределенным / ложным.
В OPA / Re go все правила являются просто операторами IF-THEN, которые присваивают значения переменным. Если часть «IF» - это логика c в теле правила. Часть «THEN» - это назначение в заголовке правила. Существует два вида утверждений IF-THEN (или правил):
- Полные правила , например,
deny = true { input.allowed == "no" }
- Частичные правила , например,
deny[msg] { input.allowed == "no" }
Полные правила присваивают значение SINGLE переменной. Если вы опускаете значение, по умолчанию оно равно true (например, deny = true { ... }
и deny { ... }
означают одно и то же.) Когда часть правила «IF» является истинной / удовлетворенной, переменной присваивается значение. Когда часть правила «IF» ложна / не удовлетворяется, переменная равна undefined . Это немного отличается от false
, но в большинстве случаев это не важно.
Частичные правила присваивают значения MULTIPLE переменной. Другими словами, они определяют набор значений. Когда часть «IF» правила является истинной / удовлетворенной, значение, определенное в заголовке правила, добавляется в набор, в противном случае значение НЕ добавляется. Если никакие значения не добавлены в набор, он все еще определен - он просто пуст.
Это рассматривается во введении: https://www.openpolicyagent.org/docs/latest/#rules
Дополнительные примеры и информацию о правилах см. https://www.openpolicyagent.org/docs/latest/policy-language/#rules