0

J'essaie de créer une règle qui permet seulement à un utilisateur de créer/modifier un document dans lequel request.auth.uid correspond au nom du document qu'il essaie de créer. De https://cloud.google.com/firestore/docs/security/secure-data:Firestore règles quand les données n'existent pas

Utilisation des variables de wildcards

Lorsque vous correspondent à une règle en utilisant un chemin de base de données avec un caractère générique, une variable est créé avec un nom correspondant à la chaîne que vous avez inclus à l'intérieur des accolades. Vous pouvez ensuite référencer ces variables dans vos règles de sécurité. Une utilisation courante de ces types de caractères génériques est de stocker les documents par ID utilisateur, puis de permettre aux utilisateurs d'accéder aux documents pour lesquels leur ID utilisateur correspond à l'ID du document.

service cloud.firestore { 
    match /databases/{database}/documents { 
    match /users/{userIDFromWildcard}/ { 
     // Users can only edit documents in the database if the documentID is 
     // equal to their userID 
     allow read, write: if request.auth.uid == userIDFromWildcard; 
    } 
    } 
} 

J'ai essayé d'utiliser ce code dans mes règles, mais des erreurs. Lors de la suppression du dernier /, c'est-à-dire match /users/{userIDFromWildcard} au lieu de match /users/{userIDFromWildcard}/, il publie, mais les autorisations ne sont pas accordées si le document n'existe pas.

Edit: J'ai aussi essayé quelque chose comme ça, mais je ne sais pas comment le faire correctement en raison du manque de documentation:

allow read, write: if request.auth.uid == request.resource.__name__; 

Ce code est en cours d'exécution qui j'obtient insufficient permissions:

this.items = afs.doc("https://stackoverflow.com/users/" + this.uid); // afs is AngularFirestore, this.uid is the uid of the authenticated user 

...

// the user is authenticated at this point 
this.items.snapshotChanges().subscribe(snapshot => { 
if (!snapshot.payload.exists) { // if user isn't in db 
    function recursive() { 
     // ... 
     this.updateDB(); // called once because of conditional 
    } 
    recursive(); 
    } else { 
     // ... 
    } 
} 

updateDB:

public updateDatabase(): void { 
    const changes: Item = { name: this.name, username: this.username, 
    photoURL: this.photoURL }; 
    this.items.set(changes).then((item) => { // causes error 
     console.log("Saving successful"); 
    }, (err) => { 
     console.log(err); 
    }).catch((err) => { 
     console.log(err); 
    }); 
} 
+0

Pouvez-vous montrer le code que vous utilisez qui produit l'erreur et à quoi ressemble l'erreur? –

+0

@hatboysam Il n'y a pas d'erreur, ça ne marche tout simplement pas. Malheureusement, les règles Firestore n'ont pas de simulateur ou d'outils de débogage décents. Le code est dans la question, un copier/coller direct du code dans le devis sauf que sans la dernière barre – Cilan

+0

ce sont seulement vos règles, qu'en est-il du code qui appelle réellement 'set()' ou 'update()' pour écrire les données? Et c'est le code qui devrait produire une erreur. –

Répondre

0

Vous avez probablement cette configuration pour les documents:

service cloud.firestore { 
    match /database/{databases}/documents { 
    match /users/{userId}/{document=**} { 
     allow read, write: if request.auth.uid == userId; 
    } 
    } 
} 

De plus, si vous devez écrire à un sous-collections voir this answer

Et plus d'informations sur la correspondance générique dans FireStore here