2016-05-03 8 views
3

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.

Antwort

0

wollte Sie:

  1. ermöglichen das Hinzufügen Besitzer & Kollaborateure Benutzer Notizen.
  2. Liste alle Notizen, die ein Benutzer besitzt.
  3. Liste alle Notizen, auf die ein Benutzer Zugriff hat.

Sie sollten collaborators Liste zu jedem Notizen hinzugefügt haben, wie folgt:

{"rules":{ 

    "users": { 
    "$user_id": { 
     "profile_and_settings":{ 
      ".write":"auth != null && auth.uid == $user_id" 
     }, 
     "owned_notes":{ 
      ".write":"auth != null && auth.uid == $user_id", 
      "$note_id":{} 
     }, 
     "accesssible_notes": { 
      ".write":"auth != null", 
      "$note_id":{} 
     } 
    } 
    }, 

    "notes": { 
    "$note_id": { 

     // to edit this node: must authenticated, new entry or owner of this node. 
     ".write":"auth != null && (!data.exists() || data.child('owner').val() == auth.uid)", 

     "owner":{ 
      ".validate":"newData.val() == auth.uid" 
     }, 

     "collaborators":{ 
      "$user_id":{} 
     }, 

     // ... other note data 

    } 
    //... 
    } 
}} 

Siehe ähnliche Frage:
Firebase rule: Do we have better ways to manage object ownership?