У меня возникла проблема, когда я пытаюсь запросить подзапрос по полю, и я пробовал эмулятор, а также поддержку firebase (все еще продолжается, но пока нет решений).
При выполнении следующего запроса:
const queryByNumber = query(
 collectionGroup(this.firestore, 'residents'), 
 where('cellNumber', '==', number)
);
return from(getDocs(queryByNumber)); 
 Этот запрос имеет ошибку:
Свойство cellNumber не определено для объекта. для 'списка' @ L6
Так выглядят правила на данный момент
rules_version = '2';
service cloud.firestore {
 match /databases/{database}/documents {
 match /{path=**}/residents/{residentDoc} {
 allow write: if resource.data.cellNumber == request.auth.token.phone_number;
 allow read: if request.auth.token.phone_number == resource.data.cellNumber;
 //allow read; //temp permission till support fix
 }
 match /Units/{unitNumber} {
 allow read: if request.auth!= null;
 function residentDoc(residentId) {
 return get(/databases/$(database)/documents/Units/$(unitNumber)/residents/$(residentId))
 }
 
 match /pets/{petId} {
 allow write: if residentDoc(request.resource.data.residentId).data.cellNumber == request.auth.token.phone_number;
 allow read: if request.auth!= null;
 }
 }
 }
}
 И это структура данных firestore на данный момент:

Я попытался изменить свой запрос так, чтобы он содержал array-containsв предложении where, но это мало что меняет.
Примечание: allow readпроверка без проверки if позволяет получить данные, поэтому запрос работает, просто правила для его защиты не работают.
Решение проблемы
Проблема в этом условии в ваших правилах:
request.auth.token.phone_number in resource.data.cellNumber
 Операция inв правилах безопасности Firestore определена только для карт и списков/массивов, но ваше cellNumberполе представляет собой простое строковое значение, которое не определяет inоперацию, как вы можете видеть здесь.
Если вы хотите проверить, совпадает ли номер телефона в токене со значением поля, используйте ==вместо in. Если вы хотите проверить, находится ли он в поле, рассмотрите возможность использования matchesметода для строки.
Также см:
 
 
Комментариев нет:
Отправить комментарий