Estoy tratando de leer una colección de documentos solo si el documento tiene la identificación de usuario del usuario actual que inició sesión con firebase. Aquí están las reglas de mi base de datos:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /todos/{todoId} { allow read: if isLoggedIn() && request.auth.uid == resource.data.userId; allow create: if isLoggedIn() && request.auth.uid == request.resource.data.userId; allow update, delete: if isLoggedIn() && request.auth.uid == resource.data.userId; } function isLoggedIn() { return request.auth != null; } } }Crear documentos no es un problema, pero sí leerlos. Aquí está mi función que recupera los datos:
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) }) }Parece que la regla resource.data.id no apunta a todo el ID de usuario y, por lo tanto, aparece FirebaseError: Permisos faltantes o insuficientes . Aquí está mi estructura de base de datos actual:
¿Alguna idea sobre por qué la regla no funciona según lo previsto?
Las reglas de seguridad de Firebase no filtran datos . En cambio, simplemente se aseguran de que cualquier operación que realice cumpla con las reglas que ha establecido.
Entonces, esta regla que tiene dice que el usuario solo puede leer documentos que tienen su propio UID:
allow read: if isLoggedIn() && request.auth.uid == resource.data.userId;Pero luego su código continúa e intenta leer todos los documentos:
this.$fire.firestore.collection('todos').get()Dado que sus reglas no permiten leer todos los documentos, se rechaza la operación.
Para permitir la operación, asegúrese de que su operación de lectura coincida con sus reglas y solo solicite documentos donde el UID coincida:
let uid = ... this.$fire.firestore.collection('todos').where("userId", "==", uid).get()Ya resolví el problema, el método para obtener los datos de firestore estaba incompleto,la solución estaba en la documentación de firebase .
La forma correcta de recuperar datos es usando la restricción 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) }) }