Agregué algunas reglas de seguridad a mi proyecto y las probé en el área de juegos de reglas, todo parece funcionar perfectamente, pero cuando intento recuperar el mismo documento usando el mismo UID de mi sitio web, aparece el error: "FirebaseError: Permisos faltantes o insuficientes".
Referencia a la colección:
dbRef = db.collection("organization").doc(organization).collection(course).doc(courseId).collection("meetings");
Esta es la instantánea de mi código:


Nota: Ya probé las reglas de seguridad en el campo de juego de reglas con diferentes uids y rutas. Y funcionó perfectamente.
dbRef = db.collection("organization").doc(organization).collection(course).doc(courseId).collection("meetings"); Esta consulta intenta obtener todos los documentos de la recopilación de meeting .
Existe la posibilidad de que la consulta anterior obtenga documentos donde designation != 'Teacher' && courseId != course ;
Por lo tanto, fallará.
De los documentos de reglas de firestore
si tienes esta regla:
match /stories/{storyid} { // Only the authenticated user who authored the document can read or write allow read, write: if request.auth != null && request.auth.uid == resource.data.author; } y esta solicitud db.collection("stories").get() .
La consulta falla incluso si el usuario actual es realmente el autor de cada documento de la historia. El motivo de este comportamiento es que cuando Cloud Firestore aplica sus reglas de seguridad, evalúa la consulta según su conjunto de resultados potencial, no según las propiedades reales de los documentos en su base de datos. Si una consulta podría incluir potencialmente documentos que violan sus reglas de seguridad, la consulta fallará.
la siguiente consulta tiene éxito porque incluye la misma restricción en el campo de autor que las reglas de seguridad:
var user = firebase.auth().currentUser; db.collection("stories").where("author", "==", user.uid).get()NB: el patio de recreo solo puede probar la obtención de documentos (no la recopilación de listas).
Solución posible. Puede escribir su consulta de tal manera que nunca pueda devolver el documento incorrecto.
Algo como esto. Cuando un estudiante está inscrito para asistir a una reunión (o curso), agregue su uid al documento de esa reunión. doc = {student_ids = [uidofstudent1, uidOfStudent2, ...]} .
Entonces puedes consultar así:
db .collection("organization") .doc(organization) .collection(course) .doc(courseId) .collection("meetings") .where('student_ids', arrayContains: studentUid);Sus reglas de Firestore pueden ser algo como esto:
match /organisation/{org}/{course}/{courseId}/meetings/{meet=**} { allow read: if request.auth.uid in resource.data.student_ids || isTeacher(request.auth.uid); }