11 votes

Règles de sécurité de Firestore pour les champs publics et privés

En ce qui concerne les règles de sécurité de la base de données Firebase Realtime, les données publiques et privées peuvent exister dans la même arborescence en utilisant par exemple la règle suivante.

Cependant, lorsque l'on utilise Firestore, il ne semble pas nous permettre de faire la même chose car le mandrin de données que l'on peut récupérer est uniquement sous collection ou document. Lorsque des données publiques et privées sont définies dans le même document et que l'on récupère des données avec la collection/le document, on obtient une erreur de permissions insuffisantes pour les données privées si l'on n'en est pas le propriétaire.

En utilisant RTDB, nous pouvons obtenir les données de 'users/{userId}/publicInfo' parce que nous n'avons aucune idée de la collection/document.

Y a-t-il un moyen de faire cela de RTDB avec Firestore ? Sinon, nous devrions avoir des collections publiques/privées séparément ?

// rule of Firebase Realtime Database
"users": {
   "$user_id": {
       ".read": "auth.uid === $user_id",
       ".write": "auth.uid === $user_id",

       "private": {
          ".read": "auth.uid === $user_id"   // --- private data
       }

       "public": {
          ".read": "auth !== null";           // --- public data 
       }
   }
}

// Firestore
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {

      match /{private=**} {
        allow read, write: if request.auth == userId;
      }

      match /{public=**} {
        allow read, write: if request.auth != null;
      }
    }
  }
}

17voto

Todd Kerpelman Points 7139

Vous ne pouvez donc pas avoir des règles de sécurité distinctes pour les différentes parties d'un document. Soit vous pouvez lire l'intégralité du document, soit vous ne le pouvez pas.

Cela dit, si vous voulez donner à votre document d'identification de l'utilisateur une sous-collection "publique" et "privée" qui contient des documents publics et privés, vous pouvez tout à fait le faire, mais pas de la manière dont vous avez actuellement configuré vos règles de sécurité.

El match /{private=**} tel que vous l'avez écrit, ne signifie pas "Correspond à toute sous-collection appelée 'private'". Il signifie : "Faites correspondre n'importe quelle sous-collection, quelle qu'elle soit, puis affectez-la à une variable appelée private ". Le " Correspondance récursive avec des jokers La section " " de la documentation couvre ce point de manière plus détaillée.

Aussi, vous devez faire référence request.auth.uid pour obtenir l'ID de l'utilisateur.

Donc, vous voulez probablement quelque chose de plus comme ça :

// Firestore
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      // You'll probably want to add security rules around the user document 
      // itself. For now, though, let's look at our subcollections:

      match /private/{anything=**} {
        // Only the user can read documents in their private collection
        allow read, write: if request.auth.uid == userId;
      }

      match /public/{anything=**} {
        // Anybody can read documents here, as long as they're signed in
        allow read, write: if request.auth != null;
      }
    }
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X