[英]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.