Firebase 数据库的匿名身份验证权限被拒绝

Permission denied on anonymous authentication for Firebase Database

我有 firebase 数据库,它工作正常,直到规则设置为:

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

但现在我需要启动我的应用程序,所以我不希望我的数据库对所有人开放。这就是为什么我将数据库规则更改为:

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

我在我的安卓应用程序中设置了匿名身份验证,但权限被拒绝的错误一直显示。顺便说一句,Anonymouse 身份验证在模拟器中工作正常。

我是这样实现的:

 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());
        }
    });

}

singleValueEvent 添加侦听器后,OnCancelled 被调用。 那么为什么拒绝许可呢? 编辑: 错误日志:

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.onCancelled(Main.java:205)
    at com.google.firebase.database.Query.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.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)

当您设置规则 "auth != null" 时,这意味着用户在完成登录之前无法访问数据库。

而登录过程是一个asynchronous,这意味着完整的监听器不会立即调用。

要解决您的问题,只需将读取数据库的代码移到完整的侦听器上即可。

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());
      }
  });

}