Вот две версии моего правила Firebase, и, на мой взгляд, они должны быть эквивалентны:
Version1:
match /transactions/{ts} {
function isOwner() {
return request.auth.uid == get(/databases/$(database)/documents/transactions/$(ts)).data.user;
}
allow read: if isOwner();
}
Version2:
match /transactions/{ts} {
function isOwner() {
return request.auth.uid == resource.data.user;
}
allow read: if isOwner();
}
Теперь, если я запрашиваю один документ, например db.collection('transactions').doc(someIDHere)
, два правила работают точно так же с точки зрения принятия или отклонения.
Однако, если я выполняю запрос, например db.collection('transactions').where('user','==',userid).get()
, то будет обработана только версия 2, версия 1 сообщит об ошибке, но я не знаю, почему это так. Я проверил документ Firestore, но там нет достаточных объяснений. В частности, что означает метод get () в операторе правила и почему он отличается по диапазону запроса между использованием get (абсолютный путь) с использованием resource.data?