Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

97
Vistas
Bloquear un documento con reglas de base de fuego

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.

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Hay algunos problemas con su regla y código:

  1. Al create , resource.data no existe
  2. Al update o delete , puede ser que el campo locked no exista
  3. Cuando usa set 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); }
about 4 years ago · Juan Pablo Isaza Denunciar

0

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)

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda