2016-04-08 14 views
0

sagen, dass ich eine Datenbank mit der folgenden Struktur:Sicherheitsregeln mit dynamischen Pfaden

  • Berechtigungen
    • $ pId (Auto-ID von Push erzeugt)
      • userId
      • roomId
      • erlaubnis
  • Benutzer
    • $ uId
      • Namen
  • Zimmer
    • $ Rid
      • Namen

Ist es möglich, eine Regel zu schreiben, die „erlaubt dem Anwender, sagt Raum zu ändern, wenn es eine Genehmigung p liegt vor, wenn p.userId = auth.uid und p.roomId = $ rId und p.permission = 'admin' "?

So weit ich kann sagen, ist es nicht möglich, ohne Erlaubnis Informationen unter jedem Raum verschachteln.

Antwort

0

Sie müssen Ihre Struktur ein wenig ändern. Verwenden Sie statt einer Push-ID zum Identifizieren von Berechtigungen eine kontrolliertere Struktur. Zum Beispiel:

"Permissions": { 
    "roomId": { 
    "userId": "role" 
    } 
} 

Jetzt können Sie den Raum sichern, wie Sie wollen mit:

{ 
    "rules": { 
    "Room": { 
     "$rId": { 
     ".write": "root.child('Permissions').child($rId).child(auth.Id).val() == 'admin'" 
     } 
    } 
    } 
} 

Ein zusätzlicher Vorteil ist, dass Sie müssen alle Berechtigungen nicht scannen, wenn Sie alle eine widerrufen möchten Benutzer Erlaubnis.

+0

Ah, danke. Es wäre jedoch schwieriger, "Geben Sie mir alle Räume, zu denen ein Benutzer gehört" sowie "Geben Sie mir alle Benutzer in einem Raum" abzufragen. Derzeit verwende ich "Ref.OrderByChild (Kind). EqualTo (Wert).", Um mir zu geben, was ich je nachdem, ob es Berechtigungen mit Benutzer-ID x oder Berechtigungen mit Raum-ID y ist. Das ist ineffizient, weil ich dann ein einzelnes Kind auf einmal zurückbekommt, weil orderByChild funktioniert. Denkst du, die empfohlene Einrichtung ist dann PermissionsByUser und PermissionsByRoom als separate, aber doppelte Zweige? – Gammon

+0

Es ist ein bisschen schwierig, das als Text zu analysieren. Aber im Allgemeinen ist es beim Modellieren von Daten in NoSQL am besten, die Daten so zu modellieren, wie Ihre App darauf zugreifen muss. Wenn Sie also eine Liste von Räumen für Benutzer anzeigen möchten, speichern Sie die Räume für jeden Benutzer. Also nicht 'ref.child ('rooms'). OrderByChild ('userid'). EqualTo (auth.uid)' aber 'ref.child ('userRooms'). Child (auth.uid)'. Letzteres ist absolut billig, auf Kosten einer doppelt vorhandenen Datenstruktur.Tot billige Skalen wirklich gut. :-) Siehe auch https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html –

Verwandte Themen