DatabaseError:Permission denied firebase

时间:2017-09-25 06:21:29

标签: android firebase firebase-realtime-database firebase-authentication firebase-security

我是firebase的新手。我想在我的应用程序中使用firebase读取/写入数据,但是当我尝试这样做时,我收到此DatabaseError: Permission denied错误。

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保留到.true,在read/write中添加了一些记录。但现在我必须通过身份验证进行更改。

5 个答案:

答案 0 :(得分:1)

我认为您正在使用不同的firebase对象进行身份验证,而另一个则使用不同的firebase对象进行查询 试试这个

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

而不是

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

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

答案 1 :(得分:1)

截至2018年底,我们还有一个来源为“权限被拒绝”错误。

Google刚刚推出了Cloud Firestore BETA。

关键是它的界面与Firebase的界面相同,只有一个下拉选择器来分隔两个数据库...

花了8h进行错误修复,最后发现默认的控制台视图是Cloud Firestore BETA视图,但不是Firebase。

因此,在配置Cloud Firestore BETA时,我的应用程序与Firebase进行了交谈。

8h迷路了...。谢谢Google ...

答案 2 :(得分: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());
    }
};

答案 3 :(得分:0)

那么,您是否在firebase控制台中启用了所需的登录方法

firebase_signin_method

答案 4 :(得分:-1)

它与数据库有关,因此在Firebase控制台中获取数据库并将规则设置为true(可读写)