Ich schreibe eine App für die Freigabe von Notizen und versuche, den besten Ansatz für die Datenstruktur zu finden, um Mitbearbeiter zu Benutzerbenachrichtigungen hinzuzufügen und gleichzeitig sinnvolle Sicherheitsregeln zu haben für die fragliche Struktur.Firebase: Sicherheitsregeln für eine gemeinschaftliche App
Was ich jetzt haben, ist die folgende:
"users": {
"johndoe": {
"notes": {
"note1Key",
"note2Key"
}
},
"jane": {
"notes": {
"note3Key",
"note4Key",
"note5Key"
}
}
...
},
"notes": {
"note1Key": {
// actual note data
},
"note2Key": {
// actual note data
},
"note3Key": {
// actual note data
},
...
},
"shared": {
"johndoe" : {
"note5Key" : true,
"note3Key" : true
},
"jane" : {
"note1Key" : true
}
...
}
Wenn „John Doe“ erstellt eine Notiz, wird die Notiz in notes/noteKey
mit Lese-/Schreibzugriff gespeichert gewährt Inhaber und Mitarbeiter vom Eigentümer hinzugefügt. Zusätzlich wird der Schlüssel der Notiz in user/johndoe/notes/noteKey
gespeichert, die nur von ihm gelesen und geschrieben werden kann. Wenn dieser Benutzer seiner Notiz einen Mitbearbeiter ("Jane") hinzufügen möchte, wird derselbe Notizschlüssel in shared/jane/noteKey
gespeichert, der global in & geschrieben werden kann. Auf diese Weise muss ich bei der Auflistung der Notizen jedes Benutzers nur von zwei Orten lesen, um alle Notizen aufzulisten, auf die ein Benutzer Zugriff hat: user/johndoe/notes
und shared/johndoe
.
Gibt es einen besseren Ansatz? Ich mag es nicht, den shared
Index global verfügbar zu haben, könnte ich das irgendwie einschränken? Da ein Benutzer möglicherweise mit einer großen Anzahl verschiedener Benutzer an verschiedenen Notizen zusammenarbeiten kann, bin ich nicht wirklich sicher, wie die Sicherheitsregeln festgelegt werden sollen, um den Lese-/Schreibzugriff auf diesen Index zu beschränken.
Ich dachte über die Umkehrung der shared
Knotenlogik, um Notizschlüssel unter seinen respektvollen Eigentümer Unterknoten zu speichern und einschließlich einer Liste von Mitarbeitern wie folgt: shared/jane/noteKey/collaborators/johndoe
. Auf diese Weise könnte ich eine globale Lese-Regel und eine restriktivere Schreib-Regel haben (jeder Benutzer kann nur in seinen eigenen shared
Knoten schreiben), dies würde jedoch die Komplexität der Auflistung aller Notizen, auf die ein Benutzer Zugriff hat, erheblich erhöhen.