2015-05-11 3 views
5

Ich habe eine Liste von Datensätzen in Firebase, die eine Gruppeneigenschaft mit null oder mehr Gruppen darauf haben wird. Ich habe auch das Firebase-Auth-Objekt, das auch keine oder mehrere Gruppen darauf haben wird. Ich möchte eine .read-Firebase-Regel für meine Datensätze einrichten, die überprüft, ob die beiden mindestens eine Gruppe haben, die in beiden Listen vorhanden ist.Wie fireBase-Regel zu überprüfen ist Benutzergruppe Array und Datensatzgruppe Array schneiden

Anders ausgedrückt: Ich habe einen Benutzer mit einem Array von Gruppen, die ihm zugewiesen wurden. Ich habe einige Datensätze, die auch eine Liste von Gruppen enthält, die angeben, welche Gruppen der Benutzer haben muss, um auf sie zuzugreifen. Wenn der angemeldete Benutzer versucht, auf den Datensatz zuzugreifen, möchte ich sicherstellen, dass der Benutzer über mindestens eine Gruppe verfügt, die der Datensatz benötigt.

Auf dem Client ich etwas tun würde, wie _.intersect(userGroups, recordGroups).length > 0

Ich bin nicht sicher, wie ich diese Regel Feuerbasis Ausdruck in einer tun. Es wäre cool, wenn es so etwas gäbe.

Record:

{ 
    someData: "test" 
    groups: ['foo', 'bar'] 
} 

Firebase Auth Objekt:

{ 
    userName: "Bob", 
    groups: ['foo', 'bar'] 
} 

Regel Daten:

{ 
    "rules": { 
    "records": { 
     "$recordId": { 
     ".read": "data.child('groups').intersectsWith(auth.groups)" 
     } 
    } 
    } 
} 

Dank.

Update: Ich denke, dass wenn hasChildren() verwendet || anstelle von & & könnte ich die Gruppennamen in die Schlüsselposition bringen und auf diese Weise auf ihre Existenz prüfen. So etwas wie "data.child('groups').hasChildren(auth.groups, 'or')"

Wo Record:

{ 
    someData: "test" 
    groups: { 
    'foo': '', 
    'bar': '' 
    } 
} 

Update2: Basierend off Kato Kommentar & Link Mir ist klar, dass, selbst wenn hasChildren tun könnten, oder es würde immer noch nicht ganz richtig funktionieren. Anforderungen für einzelne Datensätze würden funktionieren, aber Anforderungen für alle Datensätze würden einen Fehler verursachen, wenn der aktuelle Benutzer nicht auf jeden Datensatz zugreifen konnte.

Es ist immer noch nicht klar, wie Sie Daten strukturieren würden, damit dies funktioniert. Wenn ein Datensatz zu vielen Gruppen gehören könnte, wie würde das funktionieren? Dies ist ein sehr häufiges Szenario (im Grunde, wie Linux-Gruppen-Berechtigungen arbeiten), so dass ich nicht der einzige sein kann, der das versucht. Hat jemand irgendwelche Ideen/Beispiele, wie das im Firebase zu erreichen ist?

+0

Firebase-Sicherheitsregeln [kann nicht als Filter verwendet werden] (https://www.firebase.com/docs/security/guide/securing-data.html) # Abschnitt-Filter). Wahrscheinlich möchten Sie Ihre Datensätze nach Gruppe speichern, wenn sie auf diese Weise abgerufen werden sollen. – Kato

+0

Nicht sicher, wie das funktionieren würde. Benutzer gehören zu vielen Gruppen und Datensätze gehören zu vielen Gruppen. Solange sie beide eine gemeinsame Gruppe haben, sollte Zugang gewährt werden. – yodaisgreen

+0

Irgendein Update zu diesem? Ich habe ein ähnliches Problem [hier] (http://stackoverflow.com/questions/34078703/proper-firebase-security-rules-for-implementing-rbac) –

Antwort

0

Momentan glaube ich, dass es unmöglich ist. Es gibt eine begrenzte Anzahl von Variablen, Methoden und Operatoren erlaubt, hier aufgelistet:

Firebase Security Rules API

Da Funktionsdefinitionen sind in den Regeln nicht erlaubt, kann man nichts tun Phantasie wie Call array.some (Rückruf) auf einem Array, um die Übereinstimmung selbst zu tun.

Sie haben drei Möglichkeiten, die ich kenne:

1) Kopieren Sie Daten, so dass Sie die Prüfung nicht tun müssen.Dies habe ich in meinem Projekt getan: Ich wollte einige Benutzerdaten (Namen) für Benutzer verfügbar machen, die ein Netzwerk in ihren Netzwerklisten geteilt haben. Ursprünglich wollte ich die Netzwerklisten beider Mitglieder überprüfen, um zu sehen, ob es mindestens eine Übereinstimmung gab. Irgendwann wurde mir klar, dass es einfacher wäre, den Namen jedes Benutzers als Teil der Netzwerkdaten zu speichern, so dass es keinen Benutzer-Lookup geben müsste, der diese ungeraden Berechtigungen benötigt. Ich weiß nicht genug über Ihre Daten, um Ihnen vorzuschlagen, was Sie kopieren müssen.

2) Verwenden Sie Zeichenfolgen anstelle von Arrays. Sie können einen String in einen Regex umwandeln (oder ihn einfach im Regex-Format speichern) und ihn verwenden, um den anderen String nach einer Übereinstimmung zu durchsuchen.

3) Wenn Sie genug seltsame Fälle wie diesen haben, führen Sie einen Server aus, der die Anfrage in einer benutzerdefinierten Weise validiert. Erteilen Sie in der Datenbank nur Berechtigungen für Ihren Server. Sie könnten Firebase Cloud Functions verwenden oder einen eigenen Server mit den Firebase Admin SDK

Verwandte Themen