1

我是firebase的新手。我想在我的应用程序中使用firebase读取/写入数据,但是当我尝试这样做时,出现DatabaseError: Permission denied错误。DatabaseError:权限被拒绝firebase

规则上的火力点

{ 

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

代码文件文件

 Firebase authFirebaseRef = new Firebase(ApiConstants.FIREBASE_MY_URL); 
     authFirebaseRef.authWithCustomToken(AppConstants.FBT, authResultHandler); 

Firebase.AuthResultHandler authResultHandler = new Firebase.AuthResultHandler() { 
    @Override 
    public void onAuthenticated(AuthData authData) { 
     Log.v("onAuthenticated", authData.getUid()); 
     addEvents(); 
    } 

    @Override 
    public void onAuthenticationError(FirebaseError firebaseError) { 
     Log.v("onAuthenticationError= ", "FirebaseError= " + firebaseError.toString()); 
    } 
}; 

private void addEvents() { 

    mFirebaseDatabase = mFirebaseInstance.getReference("sos").child("emergencyservices"); 
    mFirebaseDatabase.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      emergencyServicesList.clear(); 
      for (DataSnapshot dataSnapshotChild : dataSnapshot.getChildren()) { 
       Log.v("onDataChange", ":" + dataSnapshotChild.child("emergencyServicesName").getValue()); 
       EmergencyServiceModel emergencyServiceModel = new EmergencyServiceModel(); 
       emergencyServiceModel.setEmergencyServiceId(dataSnapshotChild.child("emergencyServicesId").getValue().toString()); 
       emergencyServiceModel.setEmergencyServiceName(dataSnapshotChild.child("emergencyServicesName").getValue().toString()); 
       emergencyServicesList.add(emergencyServiceModel); 
      } 
      loadDataToRecyclerView(); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.v("DatabaseError", databaseError.getMessage()); 
     } 
    }); 
} 

早些时候,我在sos/emergencyservices添加一些记录通过保持.trueread/write。但现在我必须通过认证来改变它。

+0

检查此链接https://stackoverflow.com/questions/37424544/firebase-database-permission-denied-with-read-write-permissions-set-to-true –

+0

你启用从控制台登录? –

+0

@akshay_shahane是的,我已经做过 – VVB

回答

1

我觉得您使用的身份验证不同火力的对象和不同的一个查询。
试试这个

authFirebaseRef.getRoot().child("sos/emergencyservices"‌​).addValueEventListe‌​ner(new ValueEventListener() { ... }; 

代替

mFirebaseDatabase = mFirebaseInstance.getReference("sos").child("emergencyservic‌​es"); 
mFirebaseDatabase.addValueEventListener(new ValueEventListener() { ... }; 

此外,您使用的是旧版本的火力点的API。我向你推荐link。本文档将指导您将现有的Firebase.com应用升级到新的Firebase控制台和API。

+0

它在你的回答中编辑几件东西 – VVB

+0

请仔细阅读文档。升级到新的消防基地将使您的工作更加轻松,高效,并且在技术上更新。而且,你也会发现很多资源。 – Journey

+0

好的。再一次感谢你 – VVB

0

您需要确保用户在连接侦听器之前登录。既然你已经听的认证状态,它的移动,重视听众进入onAuthenticated回调代码的问题:

Firebase.AuthResultHandler authResultHandler = new Firebase.AuthResultHandler() { 
    @Override 
    public void onAuthenticated(AuthData authData) { 
     Log.v("onAuthenticated", authData.getUid()); 
     addEvents(); 

     mFirebaseDatabase = mFirebaseInstance.getReference("sos").child("emergencyservices"); 
     mFirebaseDatabase.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       emergencyServicesList.clear(); 
       for (DataSnapshot dataSnapshotChild : dataSnapshot.getChildren()) { 
        Log.v("onDataChange", ":" + dataSnapshotChild.child("emergencyServicesName").getValue()); 
        EmergencyServiceModel emergencyServiceModel = new EmergencyServiceModel(); 
        emergencyServiceModel.setEmergencyServiceId(dataSnapshotChild.child("emergencyServicesId").getValue().toString()); 
        emergencyServiceModel.setEmergencyServiceName(dataSnapshotChild.child("emergencyServicesName").getValue().toString()); 
        emergencyServicesList.add(emergencyServiceModel); 
       } 
       loadDataToRecyclerView(); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.v("DatabaseError", databaseError.getMessage()); 
      } 
     }); 
    } 

    @Override 
    public void onAuthenticationError(FirebaseError firebaseError) { 
     Log.v("onAuthenticationError= ", "FirebaseError= " + firebaseError.toString()); 
    } 
}; 
+0

谢谢你的回复。是的,我也这样做。请参阅编辑代码 – VVB

+0

嗯....不知道发生了什么。错误消息应该告诉你它失败的位置。 –

+0

@VVB它有效吗? – Journey

0

好吧,你启用火力控制台所需的登录方法

firebase_signin_method

+0

是的,我已经做到了 – VVB

+0

您是否设法注册用户? – Journey

+0

是的,我使用自定义的JWT firebase集成做到了 – VVB