2017-05-23 1 views
0

J'ai le cas suivant, comment puis-je refuser l'accès à la mise à jour (écraser) le noeud s'il existe déjà? Par exemple, la demande d'ajouts à des amis, je veux que, cette fonctionnalité a été exécutée une fois, car il définit des règles dans la base de données, mais ils ne fonctionnent pas. Comment cela peut-il être réparé?Comment empêcher l'accès aux modifications après la création d'un noeud dans la base de données Firebase?

Règles

// friends 
     "friends": { 
     "$ownerID": { 
      "friendIncomingRequests": { 
      "$secondUserID": { 
       ".write": "!data.exists()" // Only allow new nominations to be created 
      } 
      }, 
      "friendOutgoingRequests": { 
      "$secondUserID": { 
       ".write": "!data.exists()" // Only allow new nominations to be created 
      } 
      } 
     } 
     } 

données

"friends" : { 
    "8OdvaGQfMVdJrlCxdc5pOaj09hy2" : { 
     "friendOutgoingRequests" : { 
     "mp9pfsfVQKavwYddjYYPC5Ja9N93" : { 
      "timeStamp" : 1.495514876872129E9, 
      "userID" : "mp9pfsfVQKavwYddjYYPC5Ja9N93", 
      "userName" : "Tim C." 
     } 
     } 
    }, 
    "mp9pfsfVQKavwYddjYYPC5Ja9N93" : { 
     "friendIncomingRequests" : { 
     "8OdvaGQfMVdJrlCxdc5pOaj09hy2" : { 
      "senderID" : "8OdvaGQfMVdJrlCxdc5pOaj09hy2", 
      "senderName" : "Alexsander K.", 
      "timeStamp" : 1.495514876872129E9 
     } 
     } 
    } 
    }, 

Mise à jour Je pense que le problème est dans ce code, puisque j'ai ce code aussi dans les règles. Mais comment puis-je le réparer?

"rules": { 
    ".read": "auth != null", 
    ".write": "auth != null", 
} 

Mise à jour 1: Voici toutes les règles. Je dois faire une règle d'écriture spécifique (mises à jour) seulement dans les amis. J'ai vu des exemples que pour chaque branche de leurs règles, mais si j'ai besoin de faire des règles spécifiques pour une branche, et pour le reste de la base de données, vous avez besoin de règles standard comment dois-je faire mieux?

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null", 



     // card location 
    "cardLocation": { 
     // Allow anyone to read the GeoFire index 
     //".read": true, 
     // Index each location's geohash for faster querying 
     ".indexOn": "g", 

    }, 

     "cards": { 
     ".indexOn": "ownerID" 
     }, 

     "userListEvents": { 
      "$uid": { 
      ".indexOn": "isConfirmed" 
      } 
     }, 

     "userImages": { 
     "$uid": { 
      "userProfileImages": { 
          ".indexOn": "isoDate" 
      } 
     } 
     }, 

     // tags 
     "userTags": { 
     "$uid": { 
      ".indexOn": "isSelected" 
     } 
     }, 


     // people search 
     // 
     "userLocations": { 
      ".indexOn": "g" 
     }, 


     // friends 
     "friends": { 
     "$ownerID": { 
      "friendIncomingRequests": { 
      "$secondUserID": { 
       ".write": "!data.exists()" 
      } 
      }, 
      "friendOutgoingRequests": { 
      "$secondUserID": { 
       ".write": "!data.exists()" 
      } 
      } 
     } 
     } 

    } 
} 
+0

J'apprécie la mise à jour, mais je suis un peu confus. Pouvez-vous ajouter les règles supplémentaires aux règles d'origine en haut pour que je puisse voir exactement à quoi cela ressemble? Je pense que je pourrais avoir une solution pour vous, mais cette clarification aiderait. –

+0

@JenPerson Bonjour! J'ai écrit toutes les règles de base de données. Jetez un coup d'oeil s'il vous plait. Merci beaucoup! – Alexander

+0

merci! Oh, et encore une chose: quand vous dites que ça ne marche pas, voulez-vous dire que dans le test .write est toujours autorisé, ou jamais autorisé? –

Répondre

1

Je pense que le problème est dans ce code, puisque j'ai ce code aussi dans les règles. Mais comment puis-je le réparer?

"rules": { 
    ".read": "auth != null", 
    ".write": "auth != null", 
} 

Oui, votre pensée est correcte. Firebase .read et .write règles en cascade. Vous devriez donc mettre tous les .read et .write sur chaque nœud enfant de votre structure de données. Quelque chose comme ça:

{ 
    "rules": { 
    //skip this 
    "someNode": { 
     ".read": "auth != null", 
     ".write": "auth != null" 
    }, 
    // friends 
    "friends": { 
     "$ownerID": { 
     "friendIncomingRequests": { 
      "$secondUserID": { 
      ".write": "!data.exists()" 
     } 
     }, 
     "friendOutgoingRequests": { 
      "$secondUserID": { 
      ".write": "!data.exists()" 
      } 
     } 
     } 
    } 
    //... 
    } 
} 
+0

Oui, je l'ai fait, je pensais juste qu'il pourrait y avoir une meilleure solution pour faire une branche comme une exception. – Alexander

+0

La réponse ne fait pas exception pour les enfants: D –

+0

Je sais :) mais je l'ai fait et ça marche pour moi – Alexander