web-dev-qa-db-fra.com

La règle de sécurité Firestore get () ne fonctionne pas

La solution est à la fin du post. Vérifiez-le.

Решение проблемы в конце поста. Дочитайте.

juste une simple question: qu'est-ce qui ne va pas avec cela et pourquoi cela ne fonctionne pas?

Essayer d’obtenir un accès avec un utilisateur qui a le rôle 'admin' dans la section users du / Titres/{n'importe quel titre} mais toujours 

Autorisations manquantes ou insuffisantes.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow write: if false;
      allow read: if false;
    }
    function userCanWrite () {
      return get(/databases/{database}/documents/users/$(request.auth.uid)).data.role == "admin";
    }
    match /titles/{anyTitle=**} {
      allow read: if request.auth != null;
      allow write: if userCanWrite();
    }
  }
}

Voici la structure de ma base de données

P.S.

J'ai essayé une autre règle de documents officiels get(/databases/{database}/documents/users/$(request.auth.uid‌​)).data.isAdmin == true;

et cela ne fonctionne pas trop

MISE À JOUR: LA FAÇON DE FAIRE

Le support m'a aidé à trouver la solution Voici comment procéder:

structure de la base de données:

utilisateurs -> {{userid}} -> {role: "admin"}

paramètres de règle de base de données: _

get (usersPath/$ (request.auth.uid)). role == "admin" || get (usersPath/$ (request.auth.uid)). data.role == "admin";

9
numfin

J'ai contacté le support technique de Firebase pour signaler ce bogue et ils m'ont donné une solution temporaire à ce problème. Il semble qu'ils aient un bogue dans leurs systèmes du côté des règles de sécurité. Ils disent que la documentation est correcte, mais pour le moment, nous devrions contourner ce problème de la manière suivante:

get(path).data.field == true || get(path).field == true;

Le bogue étant que cet objet de données n'est pas renseigné, vous devez vérifier les deux propriétés. Il n'y a pas d'ETA pour le lancement d'une solution sur ce bogue, je leur ai donc demandé s'ils pouvaient me donner un conseil pour résoudre ce problème, je vais donc garder cette réponse à jour avec leurs informations.

12
Joan Picornell

Donc, la façon dont j'ai résolu le problème est que j'ai créé une autre Collection appelée admins

Ensuite, je viens d'ajouter la uid de l'utilisateur dont j'avais besoin en tant que telle - Voici la structure de ma base de données - https://i.imgur.com/RFxrKYT.png

Et voici les règles

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

    function isAdmin() {
      return exists(/databases/$(database)/documents/admins/$(request.auth.uid));
    }

    match /tasks/{anyTask} {
    allow read: if request.auth != null;
      allow create: if request.auth != null;
      allow update: if request.auth != null && isAdmin();
      allow delete: if request.auth != null && isAdmin();
    }
  }
}

Vous pouvez voir mon projet Open Source complet ici: https://github.com/metaburn/doocrate

3
Gal Bracha

Vous devriez utiliser $(database) au lieu de {database} dans votre code: 

get(/databases/{database}/documents/users/$(request.auth.uid)).data.role == "admin";
1
Myroslav Kolodii

Ce qui a fonctionné pour moi a été de déplacer la fonction userCanWrite au-dessus de mes règles. Il semble que la fonction doit être définie avant toute règle match qui l’appelle. La folie :-)

0
Derrick Miller