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;
}
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
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;
}
}
}
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;
}
}
}