web-dev-qa-db-fra.com

Permissions manquantes ou insuffisantes lors de l'écriture dans Firestore à l'aide d'un champ dans les règles d'accès

Je reçois une erreur en essayant d'écrire à Firestore.

J'essaie d'utiliser un champ contenant l'ID utilisateur pour ma règle de sécurité.

service cloud.firestore {
  match /databases/{database}/documents {

    match /messages/{document=**} {
      allow read: if resource.data.user_uid == request.auth.uid;
      allow write: if resource.data.user_uid == request.auth.uid;
    }
  }
}

Si j'ai des données dans ma base de données Firestore, la règle de lecture fonctionne bien - mais lorsque j'essaie d'écrire, j'obtiens: Error: Missing or insufficient permissions. Est-ce que quelque chose que je fais de mal avec cette règle d'écriture?

P.S. Si je change ma règle à ceci, je peux écrire dans ma base de données - mais cela n'est pas assez sécurisé pour mes besoins:

 match /messages/{document=**} {
      allow read: if resource.data.user_uid == request.auth.uid;
      allow write: if request.auth != null;
    }
23
Leo Farmer

resource.data fait référence aux données déjà stockées. Par conséquent, votre règle autorisait les utilisateurs à mettre à jour uniquement les données contenant déjà leur ID utilisateur.

Ce que vous voulez probablement vérifier, c'est request.resource.data qui sont les nouvelles données entrant.

Il existe un document assez détaillé sur ces champs et d'autres règles de sécurité ici: https://firebase.google.com/docs/firestore/security/rules-conditions

18
Scarygami

Cette question et la réponse acceptée m'ont été très utiles. J'ai fini par utiliser un ensemble de règles légèrement différent que je partagerai ici au cas où quelqu'un d'autre les trouve utiles.

À l'instar de l'OP, je stocke un ID utilisateur (uid) avec mes ressources. Cependant, lorsque je veux créer une nouvelle ressource, il n'y a pas encore uid. En utilisant un exemple dans la documentation , je me suis retrouvé avec des règles de sécurité ressemblant à ceci:

service cloud.firestore {
  match /databases/{database}/documents {
    match /messages/{document=**} {
      allow read, update, delete: if request.auth.uid == resource.data.uid;
      allow create: if request.auth.uid != null;
    }
  }
}
10
quicklikerabbit

Vous pouvez rendre votre base de données disponible uniquement pour la lecture et non pour l'écriture:

  service cloud.firestore {
    match /databases/{database}/documents {
     match /{document=**} {
       allow read: if true;
       allow write: if false;
      }
   }
}
0
Ssubrat Rrudra