0

Ich habe ein Problem mit Firebase-Regeln. Im Grunde habe ich ein Stammordner ‚Benutzer‘, enthält viele usersIDs genannt, die wiederum Daten enthält, genau wie folgt aus:Die Firebase-Sicherheitsregeln funktionieren nicht

users { 
    userid1 { 
     info_user { 
      a: { 
       a1: whatever 
       a2: whatever  
       a3: { 
        a3.1: whatever 
        a3.2: whatever 
        a3.3: whatever 
        a3.n: whatever 
       } 
      } 
      n: {} ... 
     } 
    }, 
    userid2 {}, ...n 
} 

Alles gut funktionieren, wenn Sie den folgenden Code ausgeführt wird, wenn es keine Sicherheitsregeln ist, wie:

{rules {".read" : true, ".write" : true}} 

function getUserInfo() { 
    var dbRef = firebase.database(); 
    var myArray = []; 
    dbRef.ref('users').on('child_added', function(snapshot) { 
     snapshot.forEach(function(childSnapshot) { 
      myArray = (childSnapshot.val().a3); 
      // do something 
     }); 
    }); 
} 

Meine Herausforderung ist die Sicherheitsregeln zu ändern, ohne die Datenbankstruktur zu ändern.

Also habe ich versucht, so etwas zu tun:

{ 
    "rules" : { 
     ".read" : false, 
     ".write" : false, 
     "users": { 
      "$userid": { 
       "info_user": { 
        "a":{ 
         ".read": "auth != null", 
         ".write": "(root.child('r').child('w').hasChild(auth.uid))", 
         "a1":{".validate": "newData.isString()"}, 
         "a2":{".validate": "newData.isString()"}, 
         "a3":{".validate": "newData.isString()"} 
        }, 
        "n": { 
         ".read": "auth != null", 
         ".write": "$user_id === auth.uid" 
        } 
       } 
      } 
     } 
    } 
} 

Das erwartete Ergebnis ist ein Knoten a3 zu lesen, wenn der Benutzer authentifiziert ist.

Wie geht das?

Antwort

2

Die Leseberechtigung für die Firebase-Datenbank wird erzwungen, wenn Sie zuerst einen Listener anhängen. Wenn Sie also einen Listener an dbRef.ref('users') anhängen, müssen Sie Leseberechtigung für /users haben. In Ihren Sicherheitsregeln ist das nicht der Fall.

Um die Regeln funktioniert, die Leseerlaubnis bis zu `Benutzer verschieben:

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

Beachten Sie, dass die Erlaubnis Kaskaden. Wenn Sie also dem Benutzer Leseberechtigung unter /users erteilen, haben Sie Zugriff auf alle Daten unter /users. Sie können diese Berechtigung für einen bestimmten Knoten unter dort nicht entfernen.

Dies führt zu einer der Gefahren bei der Sicherung Ihrer Firebase-Datenbank: Regeln können nicht zum Filtern von Daten verwendet werden. Für mehr darüber, siehe die Firebase documentation on "rules are not filters", diese answer about it und viele weitere der questions from developers struggling with the concept.

Verwandte Themen