Как работает resource.data.size () в правилах пожарного депо (что учитывается)? - PullRequest
0 голосов
/ 09 сентября 2018

TLDR : Что означает request.resource.data.size() в правилах пожарного хранилища при записи, скажем, некоторых логических значений и вложенного объекта в документ? Не уверен, что документы означают " записей на карте" (https://firebase.google.com/docs/reference/rules/rules.firestore.Resource#data, https://firebase.google.com/docs/reference/rules/rules.Map), и мои предположения оказываются неверными при тестировании в имитаторе правил (аналогичная проблема с request.resource.data.keys().size()).


Более длинная версия : возникает проблема в правилах Firestore, когда невозможно обновить данные должным образом (несмотря на аналогичные тесты, работающие в имитаторе правил). Сузили задачу до точки, где можно увидеть, что это правило, проверяющее на request.resource.data.size() равен некоторому числу.

Пример данных, передаваемых в пожарный склад update, выглядит как

 Object {
   "parentObj": Object {
     "nestedObj": Object {
       "key1": Timestamp {
         "nanoseconds": 998000000,
         "seconds": 1536498767,
       },
     },
   },
   "otherKey": true,
 }

где отметка времени генерируется с помощью firebase.firestore.Timestamp.now(). Похоже, что это нормально работает в симуляторе правил, но не для реальных данных при выполнении

let obj = {}
obj.otherKey = true
// since want to set object key name dynamically as nestedObj value,
// see https://stackoverflow.com/a/47296152/8236733
obj.parentObj = {} // needed for adding nested dynamic keys
obj.parentObj[nestedObj] = {
    key1: fb.firestore.Timestamp.now()
}

firebase.firestore.collection('mycollection')
.doc('mydoc')
.update(obj)

Среди некоторых других правил я использую правило request.resource.data.size() == 2, и это, кажется, правила, которые вызывают ошибку отказа в разрешении (так как при комментировании этих правил все снова работает). Можно было бы подумать, что, поскольку объект передается с 2 (верхними уровнями) ключами, то request.resource.data.size() = 2, но это, очевидно, не так (и при этом количество ключей в переданном объекте не является общим) (аналогичная проблема с request.resource.data.keys().size()). Так что есть длинный пример для короткого вопроса. Было бы очень полезно, если бы кто-то мог объяснить мне, что здесь происходит не так.

1 Ответ

0 голосов
/ 09 сентября 2018

Из моего последнего общения с поддержкой Firebase около месяца назад - были проблемы с request.resource.data.size() и правилами безопасности для запросов на основе отметок времени.

Мне также сказали, что request.resource.data.size() - это размер документа ПОСЛЕ успешной записи. Таким образом, если вы пишете 2 дополнительных ключа в документ с 4 ключами, то значение, которое вы должны проверить, равно 6, а не 2.

Сказав все это - у меня все еще есть проблемы с request.resource.data.size() и любыми альтернативами, такими как request.resource.size(), которые, кажется, используются в этой документации https://firebase.google.com/docs/firestore/solutions/role-based-access

У меня также есть некоторые места в моих правилах безопасности, где это, кажется, работает. Лично я не знаю, почему это так.

...