GOOGLE ADS

пятница, 6 мая 2022 г.

Правила Firestore: свойство не определено для объекта. для 'списка' @ L6

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

Также см:

  • Правила безопасности Firebase firestore разрешают, если идентификатор документа содержит строку

  • Использование contains() с правилами firebase
  • Комментариев нет:

    Отправить комментарий

    Laravel Datatable addColumn returns ID of one record only

    Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...