Así que tengo una colección sobre la que quiero consultar, pero no tengo permisos para ver todos los documentos. ¿Puedo hacer una consulta que no falle si solo se me bloquea uno de los documentos que estoy consultando? ¿O debo hacer un preprocesamiento para limpiar primero los identificadores de artículos?
firebase .firestore() .collection("articles") .where(firebase.firestore.FieldPath.documentId(), "in", articleIds) .get() .then((results) => results.docs .map((result) => console.log(result.data())) )Entonces, si articleIds = [1, 2, 3, 4, 5], entonces todo está bien, porque tengo permiso para ver esos artículos y la llamada se realiza correctamente. Sin embargo, si articleIds=[1, 2, 3, 4, 100], la llamada falla porque no tengo permiso para ver el artículo 100.
Entonces, ¿hay alguna manera de hacer que esta llamada tenga éxito incluso si no tengo permisos?
No especifica las reglas de seguridad que le otorgan acceso a los documentos 1-5 y le niegan el acceso a 100. (Los documentos ) dicen que necesita estructurar su consulta para que coincida con las reglas de seguridad. Eso implica que incluso si tiene acceso a los documentos [1, 2, 3, 4, 5], la consulta debería fallar, a menos que su regla de seguridad dependa de esa identificación.
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á.
db.collection("stories").where("author", "==", user.uid).get()Esto tendría éxito porque la regla de seguridad otorga acceso de lectura a una historia basada en el autor, y eso es parte de su consulta. Otro ejemplo en la página:
match /mydocuments/{doc} { allow read: if resource.data.x > 5; }Esta consulta falla porque potencialmente puede devolver documentos con x <= 5, incluso si los ID 1 y 3 no existen:
db.collection("mydocuments").where("x", "in", [1, 3, 6, 42, 99]).get()Pero esto tiene éxito porque todos los documentos consultados pasan la regla:
db.collection("mydocuments").where("x", "in", [6, 42, 99, 105, 200]).get()