Firebase returns 对随机 setValue() 子数据的权限被拒绝

Firebase returns permission denied on random setValue() child data

我正在测试 Firebase 规则以增加 Firebase 数据库中数据条目的安全性。我想确保:

  1. 只有 Firebase Authenticated "users" 才能 read/write 自己的账户信息进入 "accounts"

  2. 只有 Firebase Authenticated "users" 才能 read/write 将自己的字符数据转化为 "messages"。

为此我编写了以下规则:

{
  "rules": {
    "account": {
      "$uid": {
        ".read": "auth.uid === $uid",
        ".write": "auth.uid === $uid"           
      }     
    },  
    "messages": {
        "$message_id": {
        ".read": "auth !== null",
        ".write": "auth.uid === newData.child('_uid').val() && 
            root.child('account').hasChild(auth.uid) === true"  
      },
    }
  }
}

上面的规则看起来是正确的,但是我在我推入的 "messages" 个子节点的 (3) 上得到了 "failed: DatabaseError: Permission denied"已登录的用户帐户。

这是我推送到 firebase 方法的代码片段:

public void saveToFirebase(){
  String echo = "";
  String _uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
  DatabaseReference mCurrentRecord = mFirebaseGame.push();
  Log.d(LOG, "User is " + _uid + "\nNew record ID: " + mCurrentRecord.getKey());

  gameCharacter.map.put("_uid", _uid);

  try{
    for(String keys : gameCharacter.map.keySet()){
      echo += keys + ":" + gameCharacter.map.get(keys) + "\n";
      mCurrentRecord.child(keys).setValue(gameCharacter.map.get(keys));
    }
  }
  catch(Exception e){
    error = e.toString();
  }
}

这是我收到的权限被拒绝的错误:

我无法理解为什么只有子节点 "txtStr, txtCharName and txtEner" 会出现权限被拒绝的错误,而其余节点已成功推送到数据库。

如果我遗漏了我的 Firebase 规则结构中的任何内容或任何内容,希望您能指出。谢谢。

这个问题的正确答案正如@Frank van Puffelen 指出的那样,通过调用 mCurrentRecord.setValue(gameCharacter.map)[=16 一次插入所有子节点值=],而不是迭代将数据单独放入 setValue()。

这是因为 "messages" 规则,它检查 newData 中的一组批量插入的子节点。

"messages": {
   "$message_id": {
      ".read": "auth !== null",
      ".write": "auth.uid === newData.child('_uid').val() && 
         root.child('account').hasChild(auth.uid) === true"  
   },
}