2017-10-07 8 views
2

avec l'aide FireStore angularfire2 rc 2.Configurez les règles de sécurité FireStore pour permettre aux utilisateurs d'accéder uniquement leurs propres données - efficacement

Tout fonctionne très bien dans le développement sans règles de sécurité efficaces.

Ce sont les règles sans sécurité - où le code client va créer, mettre à jour et supprimer les collections au-dessous du $COLLECTION_NAME/document sans problème.

service cloud.firestore { 
    match /databases/{database}/documents { 
     match /collectionA/{userId=**} { 
      allow read, write: if true; 
     } 
     match /collectionB/{userId=**} { 
      allow read, write: if true; 
     } 
     match /collectionC/{userId=**} { 
      allow read, write: if true; 
     } 
     match /collectionD/{userId=**} { 
      allow read, write: if true; 
     } 
    } 
} 

Où je veux accéder est de permettre uniquement aux utilisateurs d'accéder à leurs propres données.

J'ai commencé avec les règles suivantes:

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

Cependant, dès que j'ajouter une sorte de règle restrictive, y compris même simplement valider la demande est autorisée.

match /databases/{database}/documents { 
    match /collectionA/{userId=**} { 
     allow read, write: if request.auth; 
    } 
    match /collectionB/{userId=**} { 
     allow read, write: if request.auth; 
    } 
    match /collectionC/{userId=**} { 
     allow read, write: if request.auth; 
    } 
    match /collectionD/{userId=**} { 
     allow read, write: if request.auth; 
    } 
} 

Je reçois des erreurs d'autorisation de code.

[code=permission-denied]: Missing or insufficient permissions.

FirebaseError: Missing or insufficient permissions.

Chaque {userId} document contient une collection qui à son tour contient des documents de sorte qu'un chemin complet pourrait être quelque chose comme

const entryCollection: AngularFirestoreCollection<Entry> = this.angularfirestore.collection('collectionC/' + user.uid + '/records' + '/2017-40' + '/entries'); 

Les demandes doivent être authentifiées que l'accès est accordé uniquement dans le client suivant authentification en utilisant l'authentification firebase. La journalisation indique que l'uid est présent et, en effet, lors de la création du document en dessous de la collection A ou B ou C ou D, le document user.uid est nommé en utilisant l'uid.

Répondre

0

La réponse courte est que {userId=**} donne userId étant un path et non un string. Cela signifie que le comparer à request.auth.uid (qui est une chaîne) échouera. Au lieu de cela, vous aurez probablement voulez quelque chose comme:

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

Cela garantit que userId est une chaîne, puis correspondent aux sous-groupes appropriés (notez que à nouveau, allSubcollections sera un path).

1

J'ai résolu ce problème comme ceci.

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

La configuration suivante a fonctionné pour moi (je l'ai utilisé allChildren par opposition à allSubcollection):

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

allChildren permettra de lecture/écriture dans toutes les sous-collections d'un document utilisateur.

Plus d'informations sur cette mise en correspondance générique est here

3

Dans mon cas, il me fallait des autorisations pour la création de l'utilisateur et pour que les autres solutions ne fonctionnent pas pour moi. Je devais également autoriser l'accès à/users/{userId}. Voici mon code:

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