Симулятор правил Firebase: как имитировать push

Вот моя база данных:

{
  "lists": {
    "list1_id_1": {
      "field1": "some value",
      "field2": "some value"
    }
  }
}

Я хочу разрешить любому пользователю создавать новые списки, но не изменять существующие, поэтому я попробовал следующие правила:

{
  "rules": {
    "lists": {
      ".read": "true",
      ".write": "!data.exists()"
    }
  }
}

Это не сработало, когда я попытался записать следующие данные в /lists/:

{ "field1": "qq", "field2": "ww" }

По-видимому, правило ".write" не удалось записать, потому что /lists/ уже существует.

Итак, я попробовал следующие правила:

{
  "rules": {
    "lists": {
      ".read": "true",
      "$list_id": {
        ".write": "!data.exists()"
      }
    }
  }
}

Это тоже не сработало, симулятор Firebase не выбрал правило, которое не удалось выполнить операцию записи, поэтому я думаю, это потому, что «.write» отсутствует в «списках».

Не могли бы вы помочь мне здесь? Я думаю, что моя проблема связана как с правилами, так и с тем, как я пытался добавить новый элемент в /lists/ в симуляторе.

P.S. Я знаю, что list_id будет сгенерирован Firebase, когда я попытаюсь передать новые данные, но я не уверен, как использовать это знание для симулятора.

Спасибо! Славик


person Slavik N    schedule 03.11.2017    source источник


Ответы (1)


Ваш второй набор правил должен выполнять эту работу, но вам нужно будет указать дочерний идентификатор в симуляторе:

{
  "rules": {
    "lists": {
      ".read": "true",
      "$list_id": {
        ".write": "!data.exists()"
      }
    }
  }
}

Переменная $list_id указывает на любого дочернего элемента в узле /lists, поэтому в симуляторе вам нужно установить местоположение в /lists/list1_id_1, чтобы протестировать запись в уже существующий дочерний элемент, что должно привести к ошибке, например:

скриншот симулятора

Операция push создает дочерний элемент с уникальным идентификатором в заданном месте. Чтобы имитировать это, вам просто нужно установить местоположение для любого случайного дочернего ключа, который, как вы знаете, еще не существует, например: /lists/some-random-string или /lists/-Kfg3YL0TS1X1SfQ9GGg.

person Grimthorr    schedule 05.11.2017
comment
Но как смоделировать добавление нового элемента в /lists/ в симуляторе, чтобы убедиться, что правило правильное? - person Slavik N; 05.11.2017
comment
push просто создает дочерний элемент с уникальным идентификатором в заданном месте. Итак, в симуляторе вам просто нужно установить местоположение для любого дочернего ключа, который, как вы знаете, еще не существует: /lists/some-random-string. Симулятор не имеет встроенной симуляции нажатия, но по сути это одно и то же. Я обновил свой ответ этим. - person Grimthorr; 06.11.2017