web-dev-qa-db-fra.com

Définition des règles de sécurité Firebase Firestore afin que seuls les utilisateurs puissent CRUD leurs propres données et tout le reste est ignoré

J'ai une application conçue pour que les utilisateurs authentifiés via Google n'aient accès qu'à leurs propres données sans fonctionnalités "sociales". Je souhaite connaître les règles de sécurité pour les critères ci-dessous.

Disons que j'ai 5 collections et que l'une d'elles s'appelle "todos" et que les données reflètent les autres collections en ce sens qu'elle a un champ pour l'uid des utilisateurs authentifiés. Le document typique ressemble à ceci:

Todos

todo:{
  title:"some titled",
  body:"we are the world , we are the children",
  uid:"2378y4c2378rdt2387btyc23r7y"  
}

Une autre collection

thing:{
  name:"some name",
  content:"Some content",
  whatever:"whu-eva",
  uid:"2378y4c2378rdt2387btyc23r7y"  
}

Je veux que l'utilisateur Google authentifié puisse CRUD toutes les données qui ont indiqué l'utilisateur uid dans le champ uid. Je souhaite que toutes les autres données soient inaccessibles à l'utilisateur connecté.

Je veux savoir comment créer des règles pour ce scénario.

Je suis en train de parcourir la documentation maintenant, mais je pense que je pourrais peut-être gagner du temps en demandant. Je n'ai pas de rôles spécifiques pour l'application. https://firebase.google.com/docs/firestore/solutions/role-based-access

En remarque, est-ce qu'une fonctionnalité de Firebase permet de lier automatiquement un utilisateur authentifié de Google à des documents créés alors qu'ils sont connectés? (Je suppose que la réponse est non et je prévoyais de saisir manuellement l'uid dans mon application et de le configurer sur le client avant la création du document).

Je vous remercie.

Mettre à jour

J'ai essayé d'utiliser le code que Klugjo a publié ci-dessous.

Lorsque j'essaye de le tester dans le simulateur, j'obtiens une erreur.

Voici ma collection et une capture d'écran de l'erreur.

enter image description here

enter image description here

Voici autre chose que j'ai essayé: enter image description here

D'après tout ce que j'ai lu, il semble que le code suivant devrait fonctionner - mais ce n'est pas le cas. J'ai complété la clé "userId" à la place de "uid" qui est écrit dans les données d'objet en haut de cet article. J'ai changé la clé pour la distinguer de l'uid.

service cloud.firestore {
  match /databases/{database}/documents {
    match /todos/{id} {
    allow read: if request.auth.uid == request.resource.data.userId;
    allow create, update, delete:
        if request.resource.data.userId == request.auth.uid;
      }
    }
  }

J'ai créé une vidéo dans laquelle j'essaye d'obtenir et de CRÉER un document. Je ne pense pas que j'utilise correctement la fonction de test.

Vidéo

https://www.youtube.com/watch?v=W7GZNxmBCBo&feature=youtu.be

[~ # ~] modifier [~ # ~]

Je le fais fonctionner lorsque je teste avec un request.auth.uid. Dans l'image ci-dessous, j'ai codé en dur "test" comme request.auth.uid.

Mon problème maintenant est que j'aimerais vraiment savoir comment le tester dans l'éditeur de règles sans coder en dur ces informations.

enter image description here

Modifier

Voici une démonstration vidéo du problème en utilisant une vraie application.

https://www.youtube.com/watch?v=J8qctcpKd4Y&feature=youtu.be

6
William

Vous cherchez quelque chose comme ça

service.cloud.firestore {
  match /databases/{database}/documents {
    match /todos/{userId} {
      allow read, update, delete: if request.auth.uid == userId;
      allow create: if request.auth.uid != null;
    }
  }
}

match /todos/{userId} rend la variable userId disponible dans la condition de règle

request.auth.uid correspond à l'utilisateur authentifié uid

0
klugjo