#javascript #firebase #google-cloud-firestore #nuxt.js #firebase-security
#javascript #firebase #google-облако-firestore #nuxt.js #firebase-безопасность
Вопрос:
Я пытаюсь прочитать коллекцию документов, только если в документе указан идентификатор пользователя текущего пользователя, вошедшего в firebase. Вот мои правила базы данных:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /todos/{todoId} {
allow read: if isLoggedIn() amp;amp; request.auth.uid == resource.data.userId;
allow create: if isLoggedIn() amp;amp; request.auth.uid == request.resource.data.userId;
allow update, delete: if isLoggedIn() amp;amp; request.auth.uid == resource.data.userId;
}
function isLoggedIn() {
return request.auth != null;
}
}
}
Создание документов не проблема, но их чтение. Вот моя функция, которая извлекает данные:
getData () {
this.$fire.firestore.collection('todos').get()
.then((doc) => {
if (doc.exists) {
console.log('Document data:', doc.data())
} else {
// doc.data() will be undefined in this case
console.log('No such document!')
}
}).catch((error) => {
console.log('Error getting document:', error)
})
}
Кажется, что resource.data.id правило не указывает на идентификатор пользователя todo, и поэтому я получаю FirebaseError: отсутствуют или недостаточно разрешений. Вот моя текущая структура базы данных:
Есть идеи о том, почему правило работает не так, как задумано?
Ответ №1:
Правила безопасности Firebase не фильтруют данные. Вместо этого они просто гарантируют, что любая выполняемая вами операция соответствует установленным вами правилам.
Итак, это правило, которое у вас есть, гласит, что пользователь может читать только документы, которые имеют свой собственный UID:
allow read: if isLoggedIn() amp;amp; request.auth.uid == resource.data.userId;
Но затем ваш код продолжает работу и пытается прочитать все документы:
this.$fire.firestore.collection('todos').get()
Поскольку ваши правила не позволяют читать все документы, операция отклоняется.
Чтобы разрешить операцию, убедитесь, что ваша операция чтения соответствует вашим правилам, и запрашивайте документы только там, где соответствует UID:
let uid = ...
this.$fire.firestore.collection('todos').where("userId", "==", uid).get()
Ответ №2:
Я уже решил проблему, метод получения данных из firestore был неполным, решение было в документации firebase.
Правильный способ извлечения данных — использовать ограничение where:
getData () {
this.$fire.firestore.collection('todos').where('userId', '==', this.user.uid).get()
.then((docs) => {
if (docs) {
// console.log('Document data:', docs.data())
docs.forEach((doc) => {
console.log(doc.data())
})
} else {
// doc.data() will be undefined in this case
console.log('No such document!')
}
}).catch((error) => {
console.log('Error getting document:', error)
})
}
Комментарии:
1. Действительно, я просто баловался. Я снова отметил ваш ответ.