1

Ich habe versucht, Regeln für einige Tage zu meiner Firebase-Datenbank hinzufügen, aber ein Fehler bleibt immer wieder und ich kann nicht finden, was falsch ist.Firebase-Multipath-Update - Berechtigung verweigert

Es ist der Fehler:

Feuerbasis ACHTUNG: Update um/fehlgeschlagen: PERMISSION_DENIED

PERMISSION_DENIED: Permission

verweigert

ich nach Lösungen gesucht und gefunden einige relevante Post (Permission denied error during multiple update on Firebase) . Es scheint, dass der angezeigte Fehler nicht richtig ist. Ich habe das, weil ich keine Rechte für meinen Root-Pfad ('/') hatte, aber laut diesem Post ist das kein Problem.

Ich habe versucht, meine 3 'schreiben' Regeln auf 'wahr' und es funktioniert, also denke ich, das Problem muss in meinen Regeln sein.

Siehe unten meinen Code.

Angular Service:

let event = { 
    "title": "Title" 
    "uid": "FZON4aEQgKNnRlHqMH7ZwynhTtp1" 
} 

let uid = this.authService.fbUser.uid; 
let eventId = this.db.list('eventsData').push(undefined).key; 

let updateObject = {}; 
updateObject[`eventData/${eventId}`] = event; 
updateObject[`userEvents/${uid}/${eventId}`] = true; 
updateObject[`eventGuests/${eventId}/${uid}`]= { 
    attendance: 2 // and some other data 
}; 

return this.db.object('/').update(updateObject); 

Datenhierarchie:

{ 
    "eventData" : { 
    "-KptoNEw3MKRfacLnqa6" : { //Some data equal to 'event' object in above Angular service } 
    }, 
    "eventGuests" : { 
    "-KptoNEw3MKRfacLnqa6" : { 
     "FZON4aEQgKNnRlHqMH7ZwynhTtp1" : { // Some data } 
    } 
    }, 
    "userEvents" : { 
    "FZON4aEQgKNnRlHqMH7ZwynhTtp1" : { 
     "-KptoNEw3MKRfacLnqa6" : true 
    } 
    }, 
    "users" : { 
    "FZON4aEQgKNnRlHqMH7ZwynhTtp1" : { //Some data } 
    } 
} 

Firebase Regeln: (I entfernt '.Read Rechte den Code sauberer zu machen, da sie nicht sind Teil des Problems)

{ 
    "rules": { 
    "eventData": { 
     "$eventId": { 
     // Event owner can update data 
     // OLD > ".write": "auth.uid == data.child('uid').val()" 
     // NEW 
     ".write": "(newData.child('uid').val() == auth.uid) && (!data.exists() || data.child('uid').val() == auth.uid)" 
     } 
    }, 
    "eventGuests": { 
     "$eventId": { 
     "$uid": { 
      // Event owner can add someone to the event 
      // Actual user can modify his attendance 
      ".write": "(auth.uid == root.child('eventData').child($eventId).child('uid').val()) || (auth.uid == $uid && data.exists() && newData.exists())" 
     } 
     } 
    }, 
    "userEvents": { 
     "$uid": { 
     "$eventId": { 
      // Event owner can add his event to someone's list 
      ".write": "auth.uid == root.child('eventData').child($eventId).child('uid').val()" 
     } 
     } 
    } 
    } 
} 

Danke für einen Blick!

UPDATE:

Da die Korrektur eines Fehlers von Frank, ich einige neue Tests lief.

Ich habe das Update nicht auf mehrere Wege gemacht, sondern eins nach dem anderen, indem ich die Kommentare kommentiert habe, die ich nicht ausführen wollte. Außerdem habe ich es mit statischen Werten versucht.

let updateObject = {}; 
updateObject[`eventData/-Kpu9op4_s3jCetav6xn`]= { 
    "title": "Title" 
    "uid": "FZON4aEQgKNnRlHqMH7ZwynhTtp1" 
}; 
return this.db.object('/').update(updateObject); 

Dann:

let updateObject = {}; 
updateObject[`userEvents/${uid}/-Kpu9op4_s3jCetav6xn`]= true; 
return this.db.object('/').update(updateObject); 

Und:

let updateObject = {}; 
updateObject[`eventGuests/-Kpu9op4_s3jCetav6xn/${this.authService.fbUser.uid}`]= { 
    attendance: 2 // and some other data 
}; 
return this.db.object('/').update(updateObject); 

Die drei von ihnen arbeitete.

Aber wenn ich den Code mit Multi-Path (3 zur gleichen Zeit) ausführen, bekomme ich immer noch die Erlaubnis verweigert Fehler.

+0

Warum haben Sie Array-Klammern um jedes Kind: '' 'EventData/$ {key}'] ''? –

+0

Beachten Sie auch, dass wir keine Ahnung haben, was "Ereignis" ist. Stellen Sie sicher, dass Ihre Frage den [minimalen, vollständigen Code enthält, der zur Reproduktion des Problems benötigt wird] (http://stackoverflow.com/help/mcve). Eine einfache Möglichkeit, dies zu gewährleisten, besteht darin, fest codierte Werte für alles zu verwenden. –

+0

Über die Klammern ist es ein Rest von, als ich ein externes Objekt verwendet habe (myUpdateObject ['eventData/$ {key}'] = myData). Lass mich das alles aktualisieren! –

Antwort

0

ich einen letzten Test obwohl das, was ich zu bestätigen lief.

Dies ist, wie meine Regeln aussah, als es früher fehlgeschlagen:

eventGuests: Schreiben Sie, wenn aktuelle Benutzer Eigentümer des Ereignisses ist, oder wenn aktuelle Benutzer ist derjenige

„modifiziert. schreibe ":" (auth.uid == root.child ('eventData'). untergeordnete ($ eventId) .child ('uid'). val()) || (auth.uid == $ uid & & Daten. exists() & & newData.exists()) "

userEvents: Schreiben Sie, wenn aktuelle Benutzer Eigentümer des Ereignisses

".WRITE" ist: „. Auth.uid == root.child ('eventdata') Kind ($ eventId) .child ('uid') .val()“

Nun, wenn ich folgendes stattdessen verwenden, das funktioniert:

(root.child ('eventdata'!) Kind ($ eventId) .exists (.) || auth.uid == root.child ('eventdata'). Kind ($ eventId) .child ('uid'). Val())

Es ist wie Daten aus der Transaktion scheint nicht zugänglich ist, bevor die Ende der Transaktion

folgendes in genau dieser Reihenfolge ...

let updateObject = {}; 
updateObject[`eventData/${eventId}`] = event; 
updateObject[`userEvents/${uid}/${eventId}`] = true; 
updateObject[`eventGuests/${eventId}/${uid}`]= { 
    attendance: 2 // and some other data 
}; 

Durch den Aufruf ... Ich erwartete zu eventdata beibehalten werden und in userEvents und eventGuests zugänglich zu sein. Und dann, wenn ein Fehler auftrat, hätte das System zurückgerollt. Aber es sieht so aus, als würde es nicht funktionieren.

Kann jemand bestätigen, dass Push-Daten innerhalb einer Transaktion nicht zugänglich sind, bis die Transaktion validiert ist?

1

Ein erster Fehler scheint in /eventData/$event:

".write": "auth.uid == data.child('uid').val()" 

Da data die vorhandenen Daten in der Lage sind, ich bin ziemlich sicher, dass diese Regel wird scheitern, wenn es keine vorhandenen Daten.

Wahrscheinlicher Sie wollen:

(newData.child('uid').val() == auth.uid) && 
(!data.exists() || data.child('uid').val() == auth.uid) 
+0

Sie haben Recht. Das war Teil des Problems, aber am Ende bekomme ich immer noch den gleichen Fehler. Ich werde meine Antwort mit den wenigen neuen Tests, die ich durchgeführt habe, und den Ergebnissen aktualisieren. –