簡體   English   中英

數據庫錯誤:權限被拒絕 Firebase

[英]DatabaseError: Permission denied 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());
        }
    });
}

早些時候,我通過將.true保持為read/writesos/emergencyservices添加了一些記錄。 但是現在我必須通過身份驗證來更改它。

我認為您使用不同的 firebase 對象進行身份驗證,使用不同的 firebase 對象進行查詢。
嘗試這個

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

代替

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

此外,您使用的是舊版本的 firebase API。 我向你推薦這個鏈接 該文檔將指導您將現有的 Firebase.com 應用升級到新的 Firebase 控制台和 API。

截至 2018 年底,我們還有一個“權限被拒絕”錯誤的來源。

Google 剛剛推出了 Cloud Firestore BETA。

關鍵是它的界面與 Firebase 相同,只有一個下拉選擇器來分隔兩個數據庫......

花了 8 小時的錯誤,終於發現默認的控制台視圖是 Cloud Firestore BETA 視圖而不是 Firebase。

因此,當我配置 Cloud Firestore BETA 時,我的應用會與 Firebase 通信。

8h 迷路了……謝謝谷歌……

在附加偵聽器之前,您需要確保用戶已登錄。 由於您已經在偵聽身份驗證狀態,因此只需將附加偵聽器的代碼移動到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());
    }
};

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

firebase_signin_method

它與數據庫有關,因此在 firebase 控制台中進入數據庫並將規則設置為 true 以進行讀/寫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM