1

Für eine Firebase-Datenbank, für die die Authentifizierung per E-Mail/Kennwort aktiviert ist, können wir Benutzern, die sich in einer von Firebase unterstützten iOS-Anwendung anmelden, Lese-/Schreibzugriff gewähren. Obwohl Firebase iOS sdk auth api zum Erstellen/Signieren/Abmelden von Benutzern zur Verfügung stellt, konnte ich keine API in Firebase SDK finden, die Lesezugriff oder Schreibzugriff für einen Benutzer bieten kann. Nehmen wir an, ich erstelle zwei Benutzer user1, user2 mit dem API. Wie kann ich Lesezugriff auf Benutzer1 und Lese-/Schreibzugriff auf Benutzer2 erteilen. Der erforderliche Zugriff gilt für die gesamte Datenbank. Ist dies nur über Sicherheitsregeln (wie über JSON im Abschnitt Regeln unter Datenbankregisterkarte in der Google Firebase-Konsole möglich) möglich? Wenn ja, wie können wir einen solchen Lese-/Schreibzugriff für verschiedene Benutzer erstellen? Wenn es über Firebase iOS SDk möglich ist, welche API zu verwenden?Firebase: Wie kann ich verschiedenen Benutzern Lese-/Schreibzugriff gewähren?

Dank

+0

Das Sicherheitsmodell für die Firebase-Datenbank wird in der Dokumentation hier beschrieben: https://firebase.google.com/docs/database/security/. Es wird auf den Firebase-Servern erzwungen, also nicht spezifisch für Ihren iOS-Client. Ich empfehle, dass Sie die Dokumentation studieren, versuchen, sie für Ihren Anwendungsfall funktionsfähig zu machen, und kommen Sie hierher zurück, wenn Sie bei der Implementierung der Regeln Probleme haben. –

Antwort

3

Es war sehr schwer für mich, mit zu beginnen zu verstehen, aber die Regeln sind sehr flexibel und lassen Sie die Basis Zugriff auf Ihre Daten auf der Grundlage anderer Datenbankinhalte. Grundsätzlich gewähren Sie Zugriff auf einen Knoten und diese Berechtigung gilt auch für alle untergeordneten Elemente und kann nicht aus tieferen Knoten in der Struktur entfernt werden. Sie können diese Datenbankregeln in der Konsole anwenden, aber es muss ein API vorhanden sein, wenn Sie es ebenfalls verwenden müssen, um die Regeln für die gesamte Datenbank festzulegen. Sie müssen ein einziges Dokument sein, damit Sie die Benutzer nicht hartcodieren möchten, aber Sie könnten sie in einen versteckten und unzugänglichen Knoten legen, auf den die Regeln zugreifen können.

Nehmen wir zum Beispiel an, Sie möchten, dass Personen Freunde mit anderen Personen befreunden und dass die andere Person beide Personen akzeptieren und zur Freundesliste hinzufügen kann. Sie könnten ein Schema ähnlich wie dieses:

uid 
    "friends" 
    friendUid1 
    friendUid2 
    friendUid3 
    "private" 
    ... some private data your friends can read 
"friendRequests" 
    targetUid 
    requestorUid -> can be written to only by requestorUid 

Der erste Schritt einen Wert friendRequests/$targetUid/$requestorUid schreibt. Die einzige Person, die auf diesen Knoten schreiben kann, ist diejenige, die als requestorUid authentifiziert wurde. targetUid würde Lesezugriff auf den targetUid-Knoten gewährt, so dass sie es lesen könnten, da es sich um ein untergeordnetes Element handelt, das jedoch nicht geschrieben wird.

Dann können Sie $requestor/friends/$targetUid für $ targetUid basierend auf der Existenz von friendRequests/targetUid/requestorUid Schreibzugriff erteilen. Dies ermöglicht es der Person, die die Freundschaftsanfrage erhalten hat, ihre eigene Benutzer-ID in die Freundesliste des Anfragers zu schreiben, aber nur, wenn der Anfragende bereits eine eigene Benutzer-ID in eine Anfrage geschrieben hat, um ein Freund zu sein. Sie würden dann die Benutzer-ID des Anfragers auf ihre eigene Freundesliste schreiben. Wenn sich die Benutzer-ID eines angemeldeten Benutzers in ihrer Freundesliste befindet, können sie auf die privaten Daten zugreifen.

{ 
    "rules": { 
    "$uid": { 
     ".read": "auth.uid === $uid", 
     ".write": "auth.uid === $uid", 
     "friends": { 
     "$friendId": { 
      ".write": "root.child('friendRequests').child($friendId).child($uid) && auth.uid === $friendId" 
     } 
     }, 
     "private": { 
     ".read": "data.parent().child('friends').child(auth.uid).exists()" 
     } 
    }, 
    "friendRequests": { 
     "$targetUid": { 
     ".read": "auth.uid === $targetUid", 
     "$requestorUid": { 
      ".write": "auth.uid === $requestorUid" 
     } 
     } 
    } 
    } 
} 

Lassen Sie uns einige „echte“ ids verwenden und sagen, dass uid 100 will Freunde mit uid 200 sein, die sie ihren eigenen ID 100 schreiben würde für 200 eine Anfrage zu sein, ist dies zulässig, da auth.uid übereinstimmen $ requestorUid und entsprechen dem letzten Schreibregel:

ref = db.getReference("friendRequests/200/100"); 
ref.setValue(true); 

Wenn Benutzer-ID 200 anmeldet, können sie alle ihre Freundanfragen an friendRequests/200 lesen. Sie sehen, dass Benutzer 100 gebeten wird, ihr Freund zu sein, also fügen sie zuerst 100 zu users/200/friends hinzu. Dies ist zulässig, da auth.uid 200 ist und sie vollen Lese-/Schreibzugriff auf den gesamten Knoten users/200 und alle untergeordneten Elemente haben.

Weiter können sie auch zu users/100/friends/200 schreiben, weil diese Regel:

"root.child('friendRequests').child($friendId).child($uid) && auth.uid === $friendId" 

auth.uid 200 sein wird, und der Scheck werden sehen, dass 100 Freunde mit 200 werden gebeten, weil friendRequests/200/100 existiert und dieser Knoten ist nur beschreibbar Benutzer 100.

Verwandte Themen