Mi colección de Firestore contiene un documento por usuario y la ID de usuario es la ID del documento.
Tengo las siguientes reglas:
match /mycollection/{userId} { allow read, update, delete: if userId == request.auth.token.email; allow create, update: if request.auth.uid != null && userId == request.auth.token.email; }Esto garantiza que
Esto funciona muy bien cuando cargo el documento del usuario "por ID".
Sin embargo, no funciona cuando el documento se carga a través de una consulta:
const query = db.collection("mycollection") .where("user", "==", userId) .where("writeDate", ">", writeDate) .get()Como puede ver, el usuario solo carga "su propio documento", por lo que, en mi opinión, la solicitud cumple con las reglas de acceso. Sin embargo, recibo un error de "Permisos faltantes o insuficientes" de todos modos.
¿Por qué?
Supongo que esto tiene que ver con el orden de ejecución de consultas y reglas en Firestore, pero no he encontrado nada en la documentación al respecto. Mientras solo acceda a los documentos que tengo derecho a leer, todo debería estar bien, ¿no?
En caso de que se lo pregunte: necesito la consulta para descargar el documento solo si ha cambiado (de ahí la cláusula "fecha" donde). Sé que puedo hacerlo con actualizaciones en tiempo real (usando onSnapshot o similar). No quiero conocer enfoques alternativos.
Lo encontré. Las siguientes reglas no funcionan:
match /mycollection/{userId} { allow read, update, delete: if userId == request.auth.token.email; allow create, update: ... }Estas reglas funcionan:
match /mycollection/{userId} { allow read, update, delete: if resource.data.user == request.auth.token.email; allow create, update: ... } El userId funciona solo si se accede al documento a través de su ID.
Si la regla se basa en un campo del documento (aquí: user ), debe usar el campo como resource.data.user .