Firebase DatabaseError:权限被拒绝

时间:2016-11-11 06:51:35

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

我想在firebase中的Items节点上保存一些数据。当我的规则

时,我能够保存
"Items":{
   ".write": "auth != null",
   ".read": "auth != null"
}

但我希望用户能够编写/更新拥有项目,我不希望使用$变量,因为它会在我的网站上添加一些数据路径。

以下方法会在我的路径上添加一些数据而不是/Items它将是/key/Items

{


"rules": {
    "Items": {
      "$user_id": {
        ".read": "auth != null",
        ".write": "$user_id === auth.uid"
      }
    }
  }
}

因此,我看到的最好的方法是像这样编写我的规则

"Items":{
       ".read": "auth != null",
        ".write": "(data.exists() && data.child('userId').val() === auth.uid) || (!data.exists() && newData.child('userId').val() === auth.uid)"

}

}

当我在模拟器上运行以下代码时,一切正常

 {
"userId":"xxxxxxxxxxxxxxxxx"
}

但是我尝试从手机上传数据,我收到错误

setValue at /Items/-KWH6tgdLPGTdascf-w3 failed: DatabaseError: Permission denied

我哪里错了?

3 个答案:

答案 0 :(得分:0)

一种更简单的方法是在允许用户更新并将对象推送到Firebase之前,仅检查登录用户的ID是否与userId变量存储的ID相同。

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
Item item;
if (user != null) {
   //logged in
   String uid = user.getUid();
   if(uid.equals(item.getUserId()){
    //allow the user to update item.
   }
} else {
  //not logged in
}

答案 1 :(得分:-1)

将数据库读写规则设置为true

"Items":{
   ".write": "true",
   ".read": "true"
}

答案 2 :(得分:-2)

根据实时日期数据库的最新版本,请执行以下操作: https://firebase.google.com/docs/firestore/security/get-started?authuser=0

在数据库的ur标签规则中添加此代码:

    // Allow read/write access to all users under any conditions
// Warning: **NEVER** use this rule set in production; it allows
// anyone to overwrite your entire database.
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}