2016-10-04 1 views
7

Ich habe zwei Benutzer in meiner Firebase-Konsole erstellt, beide haben einen anderen Benutzernamen und eine andere E-Mail-Adresse.Swift + Firebase-Sicherheit funktioniert nicht

Ich möchte sie in der Lage sein, ihre Partitur online in der Datenbank zu speichern. Das ist die Struktur:

AppName 
    - GameStats 
    - DBW9WQEs2sQn9CuPTE9t7Q1qWSz2 
     - Score : 0986 
    - Li75C2BYW7bQnKqMmrqLAZ67HUy4 
     - Score : 44131 

Um diesen Wert zugreifen und halten es synchronisiert Ich benutze diese:

let baseRef = FIRDatabase.database().reference(withPath: "GameStats/" + user.uid + "") 
let scoreRef = scoreRef.child("Score") 

scoreRef.observe(.value, with: { snapshot in 
    print(snapshot.value) 
}) 

Ich wollte, ob die beiden Benutzer testen, andere Informationen von einem anderen Benutzer zugreifen können. Ich habe die Linie, die die anderen user.uid wie aufzunehmen so:

let baseRef = FIRDatabase.database().reference(withPath: "GameStats/Li75C2BYW7bQnKqMmrqLAZ67HUy4") 

// Logged in User: DBW9WQEs2sQn9CuPTE9t7Q1qWSz2 

und aus irgendeinem Grund gibt er dies:

Optional(44131) 

Wenn ich den Wert in der Datenbank ändern, wird es automatisch aktualisiert den Wert auf die einen, den ich stelle.

Dies ist der falsche Benutzer und kann aus irgendeinem Grund darauf zugreifen.

Das sind meine Regeln:

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null", 
     "GameStats": { 
     "$user_id": { 
     ".write": "auth != null && auth.uid === $user_id && auth.provider === 'password'", 
     ".read": "auth != null && auth.uid === $user_id && auth.provider === 'password'" 
     } 
    } 
    } 
} 

Warum ist die App so dass ein Benutzer einer anderen Benutzer, Daten lesen und wie ich den Zugriff beschränken, so dass der Benutzer nur die Daten unter der Benutzer-ID zugreifen kann?

Wie @M_G vorgeschlagen, nahm ich die .write von der Eltern und die .read. So sind meine Regeln jetzt:

{ 
    "rules": { 
    // ".read": "auth != null", 
    // ".write": "auth != null", 
     "GameStats": { 
     "$user_id": { 
     ".write": "auth != null && auth.uid === $user_id && auth.provider === 'password'", 
     ".read": "auth != null && auth.uid === $user_id && auth.provider === 'password'" 
     } 
    } 
    } 
} 

ich jetzt diese Ausgabe erhalten:

[FirebaseDatabase] setValue: or removeValue: at /GameStats/DBW9WQEs2sQn9CuPTE9t7Q1qWSz2 failed: permission_denied - This is for the correct user too. I get this error if wrong user also. 
+0

Haben Sie versucht, die allgemeine '.write'-Regel zu entfernen? –

+0

@M_G meinst du: ".write": "auth! = Null"? Ich denke, diese Regeln beziehen sich nur auf die Eltern. Daher die Spezifikation der Kind Regeln – JamesG

+0

Ich würde es versuchen, da die GameStats Write-Regel scheint richtig zu sein. –

Antwort

3

Firebase-Dokument falsch ist (bis jetzt). Öffnen Sie in der Firebase-Konsole den Regelsimulator. Es gibt zu diesem Zeitpunkt keine "Passwort" -Option, ich denke, es ist ein Fehler.

Wenn Sie keine Mehrfachauthentifizierung verwenden oder Mehrfachauthentifizierung in Ihrem Projekt keine Rolle spielt, verwenden Sie den Anbieter nicht nach Ihren Regeln. Andernfalls können Sie diese Regel für die Kennwortauthentifizierung testen:

".write": "auth != null && auth.uid === $user_id && auth.token.firebase.identities.email !== null"