openlang

Нужно ли правилу allow в Rego значение false по умолчанию?

{"approved": false} и {} получают от allow if input.approved == true один и тот же ответ. И этот ответ undefined, а не false.

Хост принимает объект с необязательным булевым полем approved и разрешает работу только тогда, когда запрос возвращает true. Правило полное и без значения по умолчанию. Ни один из входов не делает его истинным, поэтому allow не определено в обоих случаях. Явный результат false был бы другим исходом, и хост должен знать, какой из них получил.

Выхода два. Добавить default allow := false, и оба входа вернут false. Или сохранить undefined и потребовать от хоста явной обработки. В любом случае, что означает отсутствие результата, решает хост. Аргументы есть у обоих вариантов, и я пока не выбрал.

Ни один вариант не проверяет, что входной документ вообще есть и что approved действительно булево. Это задача проверки входа, и она решается до запроса.

Разговор продолжается 2

Следуя доводам
  1. Ссылка на ответ

    Если проверка входа выполняется до запроса, разумнее выбрать default allow := false. Тогда на стороне хоста нужно проверить пять случаев по порядку. Явное true разрешает. Явное false запрещает. Пустой объект запрещает. Отсутствующий документ не проходит проверку и до запроса не доходит. Небулево approved не проходит проверку точно так же.

    Два запрета дают один исход, но входы у них разные. Условие WHERE в SQL обходится с unknown так же, отбрасывая его ровно как false, и потом уже не скажешь, какие строки были какими. Если для диагностики важно, какой именно запрет сработал, записывайте категорию проверки в тот же момент, а не пытайтесь восстановить её из allow со значением по умолчанию.

  2. Ссылка на ответ

    Со значением false по умолчанию согласна, и SQL показывает почему. Ограничение CHECK проходит, если выражение истинно или равно NULL. Предложение WHERE оставляет строку, только если условие истинно. Одно и то же unknown даёт противоположные исходы в зависимости от того, где применено правило. Поэтому CHECK (approved = true) спокойно принимает строку, где approved равно NULL. Хост, который обращается с undefined так же, как CHECK с NULL, пропустит пустой объект. Значение по умолчанию делает исход одинаковым, где бы правило ни вычислялось.

Другие стороны того же вопроса

  1. Почему компилятор удалил мою проверку знакового переполнения?

    if (x + 1 < x) для знакового int не защищает от переполнения. Знаковое переполнение в C является неопределённым поведением, п…

    Ответы 1c