2017-11-01 4 views
1

Wie unten gezeigt, möchte ich eine Sicherheitsregel einrichten, wenn ein Benutzer im Knoten "Benutzer" vorhanden ist, der Benutzer kann auf den Knoten "E-Mail" zugreifen. Wenn ich den Fall treffe, habe ich die eingebaute exists() Funktion benutzt, aber es scheint nicht richtig zu funktionieren. Ich habe gerade "fehlende oder unzureichende Berechtigungen" erhalten. Nur für den Fall, der Benutzer existiert sicher unter dem Knoten "Benutzer".Cloud Firestore Sicherheitsregel existiert() funktioniert nicht

Dieses Problem tritt nach wie vor, wenn die get() Funktion verwenden, in denen dieses Problem enthält (Firestore security rule get() not work)

ich total bin nicht sicher, warum diese Regel nicht funktioniert. Würde mich freuen, wenn Sie mir helfen könnten.

service cloud.firestore { 
    match /databases/{database}/documents { 
    match /emails/{email} { 
     allow read, write: if exists(/databases/$(database)/documents/users/$(request.auth.uid)); 
    } 

    match /users/{userId} { 
     allow read, write: if request.auth != null; 
    } 
    } 
} 

Antwort

0

Haben Sie versucht, get() anstelle von exists() zu verwenden? Für mich ist das Arbeits

allow read, write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data != null 
+0

Vielen Dank für Ihre Antwort. Ich habe es versucht, funktioniert aber nicht. Abgesehen von einigen speziellen Knoten funktioniert get()/exist() perfekt auf meinem Firestore. Aber ich habe diese Art von Problem nicht funktioniert wie erwartet ... Ich weiß nicht warum. –

0

Wenn Sie Signin Optionen erstellen, sollten Sie auch „requestIdToken“, um Optionen Builder gesetzt, um es dann wie „request.auth.uid“ in Firestore-Regeln zu verwenden:

GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestIdToken(getString(R.string.default_web_client_id)) 
      .requestEmail() 
      .build() 

Wenn Sie GoogleSignInAccount (zum Beispiel) in Ihrer Tätigkeit des onActivityResult bekommen, dann haben Sie es setzen Singleton Instanz Fires:

private fun firebaseAuthWithGoogle(acct: GoogleSignInAccount) { 

    AppState.googleAccount = acct 

    val mAuth = FirebaseAuth.getInstance() 

    val credential = GoogleAuthProvider.getCredential(acct.idToken, null) 

    mAuth.signInWithCredential(credential) 
      .addOnCompleteListener(this, object : OnCompleteListener<AuthResult> { 

       override fun onComplete(@NonNull task: Task<AuthResult>) { 

        when (task.isSuccessful) { 

         true -> // good, continue from this line 
         false -> showError("error sign in with google account") 
        } 
       } 
      }) 
} 
+0

Vielen Dank für Ihren präzisen Code. Ich habe Token erstellt und "request.auth.uid" funktioniert in den anderen Knoten korrekt, außer dass einige Knoten Probleme bereiten. Es scheint ziemlich verkabelt zu sein ... Schätze, ich mache etwas falsch. –

+0

Von der Sicherheitsregel von Toyr kann ich sagen, dass Sie JEDEN existierenden Benutzer auf ALLE E-Mails zugreifen lassen wollen? Stimmt es? – android51130

+0

Wenn Sie den Code, den Sie verwenden, um Benutzer in Firestore erstellen, zur Verfügung stellen - es ist ziemlich klar, Ihre Regel zu analysieren – android51130

Verwandte Themen