0

Ich habe eine Firebase-Datenbank mit den folgenden Regeln:Firebase Datenbank Regeln und PERMISSION_DENIED Fehler

{ 
    "rules": { 
    "messages": { 
     "$message": { 
     ".read": "true", 
     ".write": "newData.child('uid').val() === auth.uid" 
     } 
    } 
    } 
} 

Die Datenstruktur sieht wie folgt aus:

enter image description here

ich, ohne ein Problem, um es schreiben , aber wenn ich versuche zu lesen, erhalte ich den folgenden Fehler:

Error: permission_denied at /messages: Client doesn't have permission to access the desired data. 

Ich habe die Firebase-Dokumentation gelesen, und meine Struktur sieht genauso aus wie die angegebenen Beispiele. Kann mir bitte jemand sagen, was damit nicht stimmt?

Bitte beachten Sie: das Verschieben der Leserregel unter "Nachrichten" behebt das Problem, ist aber nicht die gewünschte Lösung, da ich eine Regel basierend auf den Nachrichtendaten (ähnlich der Schreibregel) schreiben möchte Grundregel arbeiten. Ich möchte mit einer Regel wie diese am Ende:

{ 
    "rules": { 
    "messages": { 
     "$message": { 
     ".read": "data.child('uid').val() === auth.uid", 
     ".write": "newData.child('uid').val() === auth.uid" 
     } 
    } 
    } 
} 

Antwort

1

Die Regeln, die Sie bei /messages/$message definiert sind keine Abfragen an /messages beeinflussen und da Sie keine Leseberechtigungen zu /messages hinzugefügt haben, Sie bekommen die Erlaubnis verweigert .

Wenn Sie Nachrichten von einem einzelnen Benutzer abrufen möchten, sollten Sie in Betracht ziehen, die Daten neu zu strukturieren, um die Nachrichten eines Benutzers unter der Benutzer-ID zu verschachteln, z.

{ 
    "rules": { 
    "user-messages": { 
     "$uid": { 
     ".read": "auth.uid === $uid", 
     "$mid": { 
      ".write": "newData.child('uid').val() === $uid" 
     } 
     } 
    } 
    } 
} 

Mit dieser Struktur können Sie alle Nachrichten abrufen, die einem Benutzer gehören. Wenn Sie alle Nachrichten abrufen möchten, müssen Sie auch Nachrichten an /messages schreiben. Hier können Sie die Nachrichtendaten speichern und unter /user-messages/$uid können Sie die Schlüssel für jede Nachricht speichern, die der Benutzer veröffentlicht. Sie können beide Schreibvorgänge gleichzeitig mit Updates für mehrere Standorte durchführen.

{ 
    "messages": { 
    "a": { "uid": "0", ... }, 
    "b": { "uid": "0", ... } 
    } 
    "user-messages": { 
    "0": { 
     "a": true, 
     "b": true 
    } 
    }, 
    "users": { 
    "0": { ... } 
    } 
} 

Erhalten Sie die Schlüssel für eine Nachrichten des Benutzers bei user-messages/$uid und dann jede einzelne Meldung.

+0

hmmm .. Ich begann mit einer Struktur wie dieser, aber mein Problem ist, dass ich zwei Anwendungsfälle habe; Eine, bei der ein Benutzer nur seine eigenen Nachrichten sehen kann, und zwei, bei denen ein Administrator alle Nachrichten sehen kann. Die Admin-Abfrage muss in der Lage sein, nach Attributen gefiltert zu werden, z. B. ob eine Nachricht geöffnet oder geschlossen ist. Als ich dies mit einer verschachtelten Struktur versuchte, stellte ich fest, dass das Schreiben der Admin-Abfrage unmöglich war (zu viel Verschachtelung). Klingt wie ich bin zurück zum Zeichenbrett ... :-( –

+0

So kann nur der Admin alle Nachrichten sehen? Und so ein Benutzer kann nur ihre Nachrichten sehen? – Callam

+0

Ja das ist richtig.Ich habe ein Token, das ich identifizieren kann admin Benutzer mit. Das Problem ist das Strukturieren der Daten, so dass ich sie abfragen kann und Benutzer ihre eigenen Nachrichten lesen können. –

Verwandte Themen