2017-10-19 6 views
2

d'abord, désolé pour mon mauvais anglais, ce n'est pas ma langue maternelle ...règles de sécurité Firestore: la recherche d'un id de l'utilisateur dans le tableau dans un document

Je construis une application simple à Firebase, en utilisant la Firestore base de données. Dans mon application, les utilisateurs sont membres de petits groupes. Ils ont accès aux données des autres utilisateurs. Afin de ne pas interroger trop de documents (un par utilisateur, dans une sous-collection du document du groupe), j'ai choisi d'ajouter les données des utilisateurs dans un tableau dans le document du groupe. Voici le document de mon groupe:

{ 
    "name":"fefefefe", 
    "days":[false,false,false,false,true], 
    "members":[ 
     {"email":"[email protected]","id":"aaaaaaaa","name":"Mavireck"}, 
     {"email":"[email protected]","id":"bbbbbbbb","name":"Mavireck2"}, 
    ], 
} 

Comment puis-je vérifier les règles de sécurité si un utilisateur est dans un groupe? Devrais-je utiliser un objet à la place? Je préfère vraiment ne pas utiliser de sous-collection pour les utilisateurs, car j'atteindrais trop rapidement les limites du quota gratuit ...

Merci de votre temps!

EDIT: Merci pour la réponse. Je vais changer à un objet: "Membres": {UID1: {}, UID2: {}}

Répondre

3

En général, vous devez écrire une règle comme suit:

service cloud.firestore { 
    match /databases/{database}/documents { 
    match /collection/{documentId} { 
     // works if `members` = [uid1, uid2, uid3] 
     // no way to iterate over a collection and check members 
     allow read: if request.auth.uid in resource.data.members; 
     // you could also have `members` = {uid1: {}, uid2: {}} 
     allow read: if resource.data.members[request.auth.uid] != null; 
    } 
    } 
} 

Vous pourriez utiliser aussi: sous-collections

service cloud.firestore { 
    match /databases/{database}/documents { 
    // Allow a user to read a message if the user is in the room 
    match /rooms/{roomId} { 
     match /documents/{documentId} { 
     allow read: if exists(/databases/$(database)/documents/documents/$(documentId)/users/$(request.auth.uid)); 
     } 
     match /users/{userId} { 
     // rules to allow users to operate on a document 
     } 
    } 
    } 
} 
+0

Merci, mais je ne peux pas le faire fonctionner ... Je suis tout à fait sûr que ma base de données est correcte: j'ai un objet « membres » dans le document du groupe, contenant des objets plus faciles à utiliser infos : 'members = {uid1: {}, uid2: {}}'. Cependant, en utilisant 'allow read: if resource.data.members [request.auth.uid]! = Null;' ne fonctionnera pas. J'ai également essayé 'resource.data.members [request.auth.uid] .name! = Null;', et 'resource.data.members [(request.auth.uid)]! = Null;' – Mavireck

+0

J'ai fait un simple test local: 'if (doc.data() ['membres'] [(firebase.auth() currentUser.uid)]! = null) {console.log (" not null)} ... Il est toujours connecté " not null " – Mavireck

+0

Je ne peux pas éditer alors voici mon dernier commentaire:' allow read: si resource.data.membres [(request.auth.uid)]! = null; 'ne fonctionne pas pendant' allow read: if resource.data.membres! = null; 'fait. – Mavireck