1

I Feuerbasis Datenbank haben und es funktionierte gut, bis Regeln dazu gesetzt wurde:Erlaubnis auf die anonyme Authentifizierung für Firebase-Datenbank verweigert

"rules": { 
     ".read": true, 
     ".write": false 
    } 

Aber jetzt muss ich meine App starten, so will ich nicht meine Datenbank für alle offen sein. und deshalb habe ich Datenbank Regeln geändert:

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null" 
    } 
} 

I einrichten anonymouse Authentifizierung von meiner androd App aber die Erlaubnis verweigert Fehler weiterhin zeigt. Die Anonymouse-Authentifizierung funktioniert übrigens gut vom Simulator.

Dies ist, wie ich es umgesetzt:

public void fireBaseAuthenticate(final Context context) { 
    mAuth = FirebaseAuth.getInstance(); 
    mAuth.signInAnonymously() 
     .addOnCompleteListener(new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        if (task.isSuccessful()) { 
         // debugger comes here, so Authentication is successful 
        } else { 
         // If sign in fails, display a message to the user. 

        } 

       } 
    }); 

} 

public void load(final Context context) { 

    fireBaseAuthenticate(context); 
    database = FirebaseDatabase.getInstance(); 
    databaseReference = database.getReference(); 
    databaseReference.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot categorySnaps : dataSnapshot.getChildren()) { 
       RetailChain retailChain = new RetailChain(); 
       retailChain.setName(categorySnaps.getKey()); 
       for (DataSnapshot subMenuSnaps : categorySnaps.getChildren()) { 
        for (DataSnapshot itemSnaps : subMenuSnaps.getChildren()) { 
         for (DataSnapshot productSnaps : itemSnaps.getChildren()) { 
          Product product = productSnaps.getValue(Product.class); 
          productList.add(product); 
         } 
        } 
       } 
       retailChain.setProducts(productList); 
       retailChainList.add(retailChain); 
      }  
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.w("database error: ", "onCancelled", databaseError.toException()); 
     } 
    }); 

} 

Nach der Zugabe von Listener für singleValueEvent, wird OnCancelled genannt. Warum wird die Berechtigung verweigert? EDIT: Fehlerprotokoll.

com.google.firebase.database.DatabaseException: Firebase Database error: 
    Permission denied 
    at com.google.firebase.database.DatabaseError.toException(Unknown Source) 
    at home.gio.calorieplanner.main.Main$3.onCancelled(Main.java:205) 
    at com.google.firebase.database.Query$1.onCancelled(Unknown Source) 
    at com.google.android.gms.internal.zzbpx.zza(Unknown Source) 
    at com.google.android.gms.internal.zzbqv.zzZT(Unknown Source) 
    at com.google.android.gms.internal.zzbra$1.run(Unknown Source) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

Bitte fügen Sie den Fehlercode in den Beitrag ein, damit die Leute Ihnen helfen können. Was meinst du mit "Erlaubnis verweigert Fehler zeigt"? – UmarZaii

+0

@ giusha9 bitte überprüfen Sie meine Antwort danke – faruk

Antwort

1

Wenn Sie "auth != null" gesetzt Regel bedeutet Benutzer nicht Datenbank zugreifen können, bevor sie in Zeichen fertig

Und Einloggen Prozess ist ein asynchronous, bedeutet es, die kompletten Hörer wird nicht gleich angerufen.

Um Ihr Problem zu lösen, bewegen Sie einfach den Code, der die Datenbank im vollständigen Listener liest.

public void load(final Context context) { 

    fireBaseAuthenticate(context); 

} 

public void fireBaseAuthenticate(final Context context) { 
    mAuth = FirebaseAuth.getInstance(); 
    mAuth.signInAnonymously() 
    .addOnCompleteListener(new OnCompleteListener<AuthResult>() { 
      @Override 
      public void onComplete(@NonNull Task<AuthResult> task) { 
       if (task.isSuccessful()) { 
        // load the data 
        loadFromDB(); 
       } else { 
        // If sign in fails, display a message to the user. 

       } 

      } 
    }); 

} 


private void loadFromDB(){ 
    database = FirebaseDatabase.getInstance(); 
    databaseReference = database.getReference(); 
    databaseReference.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot categorySnaps : dataSnapshot.getChildren()) { 
      RetailChain retailChain = new RetailChain(); 
      retailChain.setName(categorySnaps.getKey()); 
      for (DataSnapshot subMenuSnaps : categorySnaps.getChildren()) { 
       for (DataSnapshot itemSnaps : subMenuSnaps.getChildren()) { 
        for (DataSnapshot productSnaps : itemSnaps.getChildren()) { 
         Product product = productSnaps.getValue(Product.class); 
         productList.add(product); 
        } 
       } 
      } 
      retailChain.setProducts(productList); 
      retailChainList.add(retailChain); 
     }  
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     Log.w("database error: ", "onCancelled", databaseError.toException()); 
     } 
    }); 

} 
+0

Das hat perfekt funktioniert, danke! – giusha9