Правила безопасности Firestore действительно похожи на спагетти? - PullRequest
0 голосов
/ 09 февраля 2019

, работая над правилами безопасности Firestore, я обнаружил, что нет способа указать доступ на чтение / запись на уровне поля.Все, что можно сделать, это указать доступ на уровне документа / коллекции.

Но разве это не приводит в исполнение действительно странные структуры базы данных?

Рассмотрим этот пример:

[
  {
    "id": 15,
    "name": "room1",
    "color": "red",
    "owner": "Tim"
  },
  {
    "id": 642,
    "name": "room2",
    "color": "green",
    "owner": "Charles"
  },
  {
    "id": 989,
    "name": "room3",
    "color": "blue",
    "owner": "Jane"
  }
]

В этом примере я хочу, чтобы, например, Джейн могла прочитать Поля id name и owner каждой записи в коллекции, но я не хочу, чтобы она видела поле color изкомнаты других людей.

Это, конечно, было бы возможно с такой структурой данных:

[
  {
    "id": 15,
    "name": "room1",
    "owner": "Tim",
    "private_values": {
      "color": "red"
    }
  },
  {
    "id": 642,
    "name": "room2",
    "private_values": {
      "color": "green"
    },
    "owner": "Charles"
  },
  {
    "id": 989,
    "name": "room3",
    "private_values": {
      "color": "blue"
    },
    "owner": "Jane"
  }
]

Все, что я делал, это просто перемещал "частные" значения (вв этом случае только цвет) в другую дополнительную коллекцию.Таким образом, я могу просто установить правило для корневого объекта и еще одно дополнительное правило для объекта private_values.

Даже если это вполне возможно, я бы не стал считать его особенно чистым при экстраполяциик большему примеру, где будет, например, больше групп пользователей, которым всем необходимо видеть разные поля.

Есть ли более чистый и лучший способ сделать это, чем тот, который я только что объяснил, илиЕсть ли что-то еще, что я пропустил?

С уважением

1 Ответ

0 голосов
/ 09 февраля 2019

Вы ничего не пропустили.Это именно то, что вы должны делать.Документы в Firestore являются наиболее детализированной единицей для операций.

Обратите внимание, что вы также не можете прочитать частичный документ (вы должны прочитать все поля, если вы хотите прочитать любое из полей).Если вы пишете облачную функцию, которая срабатывает при изменении документа, вы всегда получаете содержимое всего документа и не можете написать триггер при изменении отдельного поля.

...