Tengo este conjunto de reglas en firestore.
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document} { allow read: if true; allow write: if isTrustworthy(); } match /stores/{storeId}{ match /{document} { allow read: if true; allow write: if isTrustworthy(); } match /departures/{departureId} { allow read: if true; allow write: if !(resource.data.locked); } } function isTrustworthy(){ return isSignedIn() && emailVerified(); } function isSignedIn() { return request.auth != null; } function emailVerified() { return request.auth.token.email_verified; } } }pero me da error al configurar, actualizar o borrar en la ruta de salidas.
p.ej.
this.afs.collection('stores').doc(this.auth.store) .collection('departures') .doc(element.shipping.trackingNumber.toString()) .set({"test":true})el documento no existe, pero tampoco funcionará si el documento existe, independientemente del parámetro "bloqueado" obtuve el siguiente error:
ERROR Error: no capturado (en promesa): FirebaseError: [código = permiso denegado]: Permisos faltantes o insuficientes.
FirebaseError: permisos faltantes o insuficientes.
Lo que necesito es que si el documento tiene un parámetro "bloqueado" establecido en verdadero, no se puede eliminar, actualizar ni configurar con la opción {merge:true}.
Cualquier ayuda será muy apreciada.
Hay algunos problemas con su regla y código:
create , resource.data no existeupdate o delete , puede ser que el campo locked no existaset para crear o actualizar un documento en Firestore, debe agregar las opciones {merge: true} para actualizar el documento en lugar de sobrescribirlo en caso de que ya exista.Prueba esto en su lugar:
Código:
this.afs.collection('stores').doc(this.auth.store) .collection('departures') .doc(element.shipping.trackingNumber.toString()) .set({"test":true}, {merge: true})Normas:
match /departures/{departureId} { allow read: if true; allow create: if true; allow update, delete: if !resource.data.get("locked", false); }Agrego un conjunto de funciones a mis reglas para facilitar la escritura de reglas como esta:
function existing() { return resource.data; } function resulting() { return request.resource.data; } function matchField(fieldName) { return existing()[fieldName] == resulting()[fieldName]; } resource se refiere al documento al que se accede y request.resource se refiere a los nuevos datos del documento. Con estos puede hacer referencia a valores en el documento existente o entrante.
matchField es útil en combinación con varios reclamos/roles para proteger partes de los documentos para que no se modifiquen.
En su caso puede comprobar el estado de un campo específico " locked ", por ejemplo alguna forma de:
match /whatever/points/to/the/doc { allow write: if !existing().locked }(Utilizo un par de docenas de funciones de este tipo PRINCIPALMENTE para que mis reglas casi parezcan texto)