У меня есть коллекция объявлений, которая используется для хранения данных.Однако у каждого документа есть поле, называемое «разрешения», которое содержит строку уровня разрешений.Я написал функцию, чтобы определить, есть ли у пользователя доступ на основе его уровня доступа и ресурса.
Когда я настраиваю обратный вызов onSnapshot для одного документа, который должен работать, я получаю ответ.Как только я переключаю его на получение снимка коллекции, он получает ошибку недопустимых разрешений.Основываясь на том, что я мог найти, Firestore не работает, если есть вероятность, что пользователь не имеет доступа ни к одному из документов в коллекции.Какая модель, в которой я должен использовать?Как я могу получить документы, к которым у пользователя тоже должен быть доступ?
Правила
match /chapters/{chapter} {
function isMember() {
return exists(/databases/$(database)/documents/chapters/$(chapter)/members/$(request.auth.uid))
}
function getUser() {
return get(/databases/$(database)/documents/chapters/$(chapter)/members/$(request.auth.uid))
}
function hasPermission(userPermission, documentPermission) {
return documentPermission == "all" || userPermission == "admin" || userPermission == documentPermission
}
allow read: if isMember()
match /announcements/{announcement} {
allow read: if isMember() && hasPermission(getUser().data.permissions, resource.data.permissions)
}
}
Работает vvv
firestore.collection("chapters").doc("chapter-1").collection("announcements").doc("doc1").onSnapshot(doc => {
const announcements = doc.data()
console.log(announcements)
})
Не работает vvv
firestore.collection("chapters").doc("chapter-1").collection("announcements").onSnapshot(docs => {
docs.forEach(doc => {
const announcements = doc.data()
console.log(announcements)
})
})