簡體   English   中英

驗證Firebase后讀取數據時權限被拒絕

[英]Permission denied when read data after authentication Firebase

我是Firebase的新手,我在身份驗證Firebase之后讀取數據時遇到的問題是PERMISSION DENIED。 我研究了所有主題,並在這里發現了相同的問題: 驗證后讀取數據時,Firebase權限被拒絕 但是弗蘭克·范·普菲倫的回答對我不起作用。 這是我的Firebase規則:

{
"rules": {
  "user": {
    "$uid": {
      "profile": {
        ".read": "auth != null && auth.uid == $uid",
        ".write": "auth != null && auth.uid == $uid"
      },
      "account": {
        ".read": false,
        ".write": false
      },
      "shared": {
        "$sharedid": {
          ".read":  "auth != null && auth.uid == $uid",
          ".write": false
        }
      },
      "shared_user": {
        ".read": false,
        ".write": false
      }
    }
  },
  "node": {
    "$uid": {
      ".read": "auth != null && auth.uid == $uid",
      ".write": "auth != null && auth.uid == $uid"
    }
  },
 "shared": {
    "$sharedid": {
      ".read": "auth != null && root.child('user').child(auth.uid).child('shared').child($sharedid).child('read').val() === true",
      ".write": "auth != null && root.child('user').child(auth.uid).child('shared').child($sharedid).child('write').val() === true"
    }
  }
}

}

我找到了很多方法,但仍然被拒絕。 請幫我!

編輯:這是我的身份驗證:

mFirebaseRef= new Firebase("https://my-dashboard.firebaseio.com");
mFirebaseRef.authWithPassword(Constants.EMAIL, Constants.PASSWORD, new AuthResultHandler("password"));

身份驗證句柄:

private class AuthResultHandler implements Firebase.AuthResultHandler{

    private final String provider;

    public AuthResultHandler(String provider){
        this.provider=provider;
    }
    @Override
    public void onAuthenticated(AuthData authData) {
        Log.i(TAG, provider + " auth successful");
        getData(mFirebaseRef.child("node"));
    }

    @Override
    public void onAuthenticationError(FirebaseError firebaseError) {
        Log.i(TAG, provider+ " auth unsuccessful");
    }
}

最后,獲取數據:==> 權限被拒絕

private void getData(Query ref){
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.i(TAG, " onDataChange");
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            Log.i(TAG, firebaseError.getMessage());
        }
    });
}

你做錯了 您的代碼表明您在安全規則中對“節點”子節點沒有讀寫權限。 您具有“ node”子節點“ $ uid”的讀寫權限。

所以改變:

getData(mFirebaseRef.child("node"));

至 :

getData( mFirebaseRef.child("node").child(authData.getUid()) );

請記住:Firebase安全規則與自上而下的方法一起使用,並且如果您不提及規則,則默認情況下,讀寫都是錯誤的。 因此,在子節點“ node”上您沒有提到讀取或寫入權限,因此默認情況下為false。 但是對於內部子對象“ $ uid”,您提到了讀取和寫入安全規則,因此,如果客戶端使用相同的uid進行身份驗證,則可以讀取或寫入該安全規則。

另外,請記住,如果您在頂層指定了讀寫權限,那么內部定義就沒有意義,例如,說您有如下規則:

.
.
"node" : {

    ".read" : true,

    "$uid": {
        ".read": "auth != null && auth.uid == $uid",
        ".write": "auth != null && auth.uid == $uid"
    }
}
.
.

在上面的示例中,任何人都可以讀取“節點”子級及其所有子級,其中包括“ $ uid”子級,因為“ $ uid”的父級已定義了全部安全性規則,因此其所有子級的安全性規則均為覆蓋。 因此,請注意規則定義。

希望這能解決您的問題:)

暫無
暫無

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

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