Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

98
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda