У меня возникла проблема, когда я пытаюсь запросить подзапрос по полю, и я пробовал эмулятор, а также поддержку 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
метода для строки.
Также см:
Комментариев нет:
Отправить комментарий