2017-07-06 1 views
0

J'essaie de sécuriser ma base de données firebase pour permettre la création de nouveaux enregistrements, mais ne permet pas la suppression d'enregistrements existants. En fin de compte, je prévois également d'utiliser l'authentification Firebase dans mon application, et de permettre aux utilisateurs de mettre à jour les enregistrements existants s'ils en sont l'auteur, mais j'essaie de faire fonctionner le cas simple en premier.Les règles de base de données Firebase - `data.exists()` semble toujours être vrai, bug possible?

Cependant! Peu importe ce que j'essaie dans le simulateur de règles de base de données, malgré ce que la documentation seems to suggest, la valeur de data.exists() semble toujours être vraie. D'après ce que je peux comprendre de the documentation, la variable data représente un enregistrement dans la base de données comme avant une opération. C'est-à-dire, pour les créations, data n'existerait pas, et pour les mises à jour/suppressions, data ferait référence à un enregistrement réel qui existe dans la base de données. Cela ne semble pas être le cas, au point où je soupçonnais en fait un bogue dans Firebase, comme lors de la définition des règles suivantes sur ma base de données, toutes les opérations d'écriture ne sont pas autorisés:

{ 
    "rules": { 
    ".read": true, 
    ".write": "!data.exists()" 
    } 
} 

Non Peu importe les valeurs que je mets dans le simulateur, que ce soit la localisation ou les données. J'ai même écrit une petite application EmberJS pour vérifier si le simulateur dit la vérité et lui aussi, est refusé l'autorisation pour toutes les opérations d'écriture.

Je n'ai vraiment aucune idée d'où aller à partir d'ici car je suis à peu près hors de choses à essayer. J'ai essayé de supprimer tous les enregistrements de ma base de données, ce qui permet au simulateur de penser qu'il peut effectuer des opérations d'écriture, mais mon application de test obtient toujours PERMISSION_DENIED, donc je ne sais pas ce qui cause des incohérences.

Est-ce que ma compréhension de la variable data prédéfinie est correcte? Si oui, pourquoi ne puis-je pas écrire les règles que je veux? J'ai vu snippets essayant littéralement d'accomplir ma règle «créer seulement, non-supprimer» qui semblent aligner avec ma compréhension.

Dernière note: J'essaie cela dans un tout nouveau projet Firebase avec juste les règles ci-dessus, et seulement ~ quelques enregistrements de données indésirables juxtaposant ma base de données.

Répondre

2

Étant donné que vous avez placé le !data.exists() à l'emplacement racine de votre base de données, data fait référence à l'ensemble de la base de données. Vous ne pourrez écrire dans la base de données que lorsqu'elle sera complètement vide.

Vous indiquez que vous exécutez vos tests avec seulement quelques enregistrements de données indésirables qui traînent autour de ma base de données. Ces enregistrements entraîneront data.exists() à être vrai.

Vous pouvez atteindre votre objectif en plaçant la règle !data.exists() dans votre arborescence à l'emplacement spécifique où vous souhaitez exiger qu'aucune donnée n'existe déjà. Ceci est généralement effectué à un emplacement avec une clé générique, comme dans l'exemple que vous avez lié:

{ 
    "rules": { 
    // default rules are false if not specified 

    "posts": { 
     ".read": true, // everyone can read all posts 

     "$postId": { 
     // a new post can be created if it does not exist 
     // existing posts can only be edited by their original "author" 
     ".write": "!data.exists() && newData.exists() || data.child('author').val() == auth.uid", 
     ".validate": "newData.hasChildren(['title', 'author', 'timestamp'])", 
     } 
    } 
    } 
} 
+0

Salut merci pour la réponse. C'était le morceau manquant dans ma compréhension, je n'avais clairement pas analysé la documentation correctement. J'ai mis en œuvre des changements comme celui-ci et maintenant tout fonctionne à 100% comme prévu. Je supposais que 'data' était une sorte de variable résolue magiquement qui a été déduite en fonction de la demande que vous faites, et non basée sur les règles elles-mêmes. Merci! – Peabnuts123