web-dev-qa-db-fra.com

Les règles de sécurité de Firestore vérifient s'il existe une référence

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

14
Ichor de Dionysos

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.

5
Gerardo

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