Je me demande comment je pourrais vérifier si une valeur de document est une référence à un autre document et si le document existe en utilisant des règles de sécurité Firebase.
Ce que j'ai essayé:
function validate(document) {
return exists(document.reference)
}
match /collection/{document} {
allow read: if request.auth != null;
allow create, update: if isAdmin(request.auth.uid) && validate(request.resource.data);
}
Comme cela ne fonctionnait pas, j'ai essayé de comprendre quel type document.ref
est. Malheureusement, il ne semble y avoir aucun type de ceux répertoriés ici: https://firebase.google.com/docs/firestore/reference/security/?authuser=0#data_types
J'ai essayé path
car c'est le plus évident avec lequel il existe. Je ne m'attendais pas à ce que ça marche. Une autre supposition était peut-être map
ou string
. Les deux étaient incorrects.
Comme je n'ai aucune idée de ce que cela pourrait être et qu'il n'y a rien de documenté sur la façon de convertir la référence en chemin, je dois maintenant demander ici.
Quelqu'un a-t-il trouvé une solution à cela?
TL; DR:
Je dois vérifier à l'aide des règles de sécurité Firestore si une référence enregistrée dans un document est présente et existe dans la base de données.
Merci, Dennis
Dans cette ligne:
allow create, update: if isAdmin(request.auth.uid) && validate(request.resource.data)
au lieu d'appeler "request.resource.data", vous devez simplement appeler "resource.data":
allow create, update: if isAdmin(request.auth.uid) && validate(resource.data)
Comme mentionné ici , la variable de ressource représente le document Firestore, tandis que la variable " request " représente la demande effectuée sur ce chemin, ne contenant donc pas d'informations sur les valeurs réelles dans le document.
Essayez-le et faites-moi savoir si cela ne fonctionne pas pour vous.
Selon la documentation exists()
:
Le chemin fourni doit commencer par
/databases/$(database)/documents
.
Vous devez donc changer votre fonction de validation pour:
function validate(document) {
return exists(/databases/$(database)/documents/$(document.reference))
}