2017-10-10 3 views
7

J'essaie actuellement de construire une petite application sur firebase comme une évaluation de celui-ci. Il semble intéressant et super productif, mais j'ai un problème avec les règles de firestore.Firestore lire les règles avec auto-condition

J'ai une collection (jeux) avec des objets ressemblant à ceci:

{ 
    "name":String, 
    "description":String, 
    "owners": 
    { 
     "uid": String 
     "uid2": String 
    } 
} 

Et règles établies comme suit:

service cloud.firestore { 
    match /databases/{database}/documents { 
     match /games { 
      match /{game} { 
       allow write: if request.auth != null && request.resource.data.owners[request.auth.uid] == 'ADMIN'; 
       allow update: if request.auth != null && resource.data.owners[request.auth.uid] == 'ADMIN'; 
       allow read: if request.auth != null && resource.data.owners[request.auth.uid] == 'ADMIN'; 
      } 
     } 
    } 
} 

Tout en écriture, mise à jour le travail bien. Lecture seule fonctionne pour les documents uniques. Lorsque j'essaie de lire une collection, j'obtiens une erreur d'accès comme si l'utilisateur n'y avait pas droit. La partie qui le fait fonctionner est pas

resource.data.owners[request.auth.uid] == 'ADMIN'. 

Ajout d'un where("owners."+auth.uid,"==", 'ADMIN') à la collecte requête ne contribue pas non plus.

Qu'est-ce que je fais mal ici? Y a-t-il une approche suggérée dans Firestore firebase pour un scénario similaire?

EDIT: Je essayé d'ajouter des règles 'get' et 'liste' comme ceci:

allow list: if request.auth != null;

allow get: if request.auth != null && resource.data.owners[request.auth.uid] == 'ADMIN';

Il ne fonctionne pas comme prévu. Je m'attendais à ce qu'il me permette de lister les documents avec where mais s'il y a un document que je ne pouvais pas get je m'attendais à avoir des "permissions manquantes ou insuffisantes". Ce que j'ai pu faire était de lister TOUS les documents mais pas de lire directement certains d'entre eux (la règle get fonctionne quand on essaie d'aller chercher un seul document mais pas quand on le liste d'une collection).

EDIT 2: On dirait que selon @MikeMcDonald mes attentes étaient correctes, mais il est actuellement buggé. En attente du correctif

EDIT 3: Il travaille maintenant très bien avec les règles pour obtenir et liste figurant ainsi:

allow get, list: if request.auth != null && resource.data.owners[request.auth.uid] == 'ADMIN';

+1

Notez que 'write' est un sur-ensemble de' update', donc votre règle actuellement 'write' écrase la' update'. Changez-le en 'create' et vous vous rapprocherez un peu plus de votre objectif. –

+0

@MikeMcDonald merci, je vais le faire. J'ai aussi trouvé (après avoir lu un peu plus près) qu'il y a deux "lectures". 'get' et' list' plus tard, je vais essayer de permettre une liste plus large peut-être que c'est quelque chose dont j'ai besoin. Merci! – Monku

+1

'read' est le parapluie contenant' get' et 'list'. J'ai confirmé que ce qui précède est un bug - cela devrait fonctionner, mais nous ne traitons pas correctement les membres du tableau ici. Je vais suivre ici une fois que le correctif est sorti. –

Répondre

0

Je pense que créer et mettre à jour fonctionne parce qu'ils font partie d'écriture et de l'état 1 couvre.