0

Ich möchte eine App erstellen, die viele Benutzerdaten hat. Nehmen wir an, jeder Benutzer verfolgt seine eigene Zeit pro Aufgabe. Wenn ich speichern war abgeflacht es es würde wie folgt aussehen:Speichern von Benutzerdaten abgeflachte Sicherheit

{ 
    users: { 
     USER_ID_1: { 
      name: 'Mat', 
      tasks: { 
       TASK_ID_1: true, 
       TASK_ID_2: true, 
       ... 
      } 
     }, 
    }, 
    tasks: { 
     TASK_ID_1: { 
      start: 0, 
      end: 1 
     }, 
     TASK_ID_2: { 
      start: 1, 
      end: 2 
     } 
    } 
} 

Nun möchte Ich mag abfragen und alle die Aufgabe, Informationen für den Benutzer zu erhalten. Im Moment sind die Daten klein. Von ihren Führern: https://www.firebase.com/docs/web/guide/structuring-data.html heißt es (gegen Ende) "... Bis wir in Zehntausende von Aufzeichnungen geraten ..." und dann nicht erklärt, wie man damit umgeht.

Also meine Frage ist wie folgt. Ich weiß, dass wir nicht über die Sicherheit filtern können, aber kann ich die Sicherheit einschränken, um zu beschränken, auf was die Leute Zugriff haben, und dann bei der Suche die Benutzer-ID zugrunde legen? Meine Struktur würde dann dazu drehen:

{ 
    users: { 
     USER_ID_1: { 
      name: 'Mat' 
     } 
    }, 
    tasks: { 
     TASK_ID_1: { 
      user: USER_ID_1, 
      start: 0, 
      end: 1 
     }, 
     TASK_ID_2: { 
      user: USER_ID_1, 
      start: 1, 
      end: 2 
     }, 
     ... 
    } 
} 

Dann würde ich meine Sicherheitsregeln einrichten, um nur jede Aufgabe für den Benutzer zugänglich erlauben werden, die sie erstellt hat, und meine ref Abfrage würde wie folgt aussehen:

var ref = new Firebase("https://MY_FIREBASE.firebaseio.com/"); 

$scope.tasks = $firebaseArray(ref.child('tasks/') 
    .orderByChild('user') 
    .startAt('USER_ID_1') 
    .endAt('USER_ID_1')); 

Ist das, wie ich es strukturieren sollte? Meine Abfrage funktioniert, aber ich bin mir nicht sicher, ob es funktioniert, sobald ich die Sicherheit eingeführt habe, bei der ein Benutzer keine anderen Benutzeraufgaben sehen kann.

Antwort

2

Sie haben bereits gelesen, dass Sicherheitsregeln nicht zum Filtern von Daten verwendet werden können. Nicht einmal die kreative Datenmodellierung kann das ändern.

:-)

Um richtig sicheren Zugriff auf Ihre Aufgaben benötigen Sie so etwas wie:

"tasks": { 
    "$taskid": { 
    ".read": "auth.uid === data.child(user).val()" 
    } 
} 

Damit kann jeder Benutzer ihre eigenen Aufgaben nur lesen.

Aber mit diesen Regeln wird Ihre Abfrage nicht funktionieren. Am meisten Kern Ihrer Anfrage ist aus tasks Lesen hier:

ref.child('tasks/')...some-filtering...on(... 

Und da Ihre Benutzer nicht über die Berechtigung Lesen auf tasks dieser Lesevorgang fehlschlägt.

Wenn Sie dem Benutzer Leseberechtigung auf tasks geben, würde das Lesen und die Abfrage funktionieren, aber der Benutzer könnte dann auch alle Aufgaben lesen, denen Sie keinen Zugriff gewähren möchten.

+0

Das war, wovor ich Angst hatte! Gibt es einen Weg dahin? Haben Sie eine Empfehlung, wie ich meine Daten strukturieren kann? Das Einzige, woran ich denken kann, ist, alle unter jedem Benutzer zu verstecken. p.s. danke für die schnelle Antwort :) –

+1

Ihre anfängliche Datenstruktur hat einen Index für jeden Benutzer, der die Aufgaben aufzählt, zu denen sie Zugang haben. Damit brauchst du keine Abfrage, du kannst einfach 'ref.child ('users'). Child ('authData.uid) .child (' tasks '). On (...'. –

+0

Richtig, aber wie mache ich bekomme ich alle Aufgabendaten? Das wird mich wissen lassen, was die IDs sind? –

Verwandte Themen