数据验证问题 Firebase 实时数据库规则

Data validation issue Firebase RealTime Database rules

我正在尝试制定一些安全规则以允许经过身份验证的用户访问(读/写)chats 基于数据验证的某些条件的路径。

这是我的规则:

{
  "rules": {
    "chats": {
      "$chatID": {
        ".read": "data.child('members/'+auth.uid).exists()",
        ".write": "(!data.exists() && newData.child('members').exists() && newData.child('members/'+auth.uid).exists()) || data.child('members/'+auth.uid).exists()",  
      }
    },
  }
}

这是我的 json :

{
    "chats/1d771b40-917c-11ec-b57d-a55c6126c658":{
        "uid":"1d771b40-917c-11ec-b57d-a55c6126c658",
        "name":"",
        "updatedAt":1645272534466,
        "createdAt":1645272279796,
        "senderID":"user1",
        "members":{
            "user1":true,
            "user2":true
        },
        "created":true,
    }
}

我不明白为什么它被拒绝写入,你能解释一下哪个值 newData 准确吗?

我已经设置了一个非常基本的规则来测试:

{
  "rules": {
    "chats": {
      "$chatID": {
        ".read": "data.child('members/'+auth.uid).exists()",
        ".write": "newData.child('members').exists()",  
      }
    }
  }
}

被拒绝了,我也试过了:

{
  "rules": {
    "chats": {
      "$chatID": {
        ".read": "data.child('members/'+auth.uid).exists()",
        ".write": "newData.parent().child('members').exists()",  
      }
    }
  }
}

根据 documentation,我认为 newData 包含 json 如果给定路径允许写入,将会发生的数据,在这种情况下意味着:

{
        "uid":"1d771b40-917c-11ec-b57d-a55c6126c658",
        "name":"",
        "updatedAt":1645272534466,
        "createdAt":1645272279796,
        "senderID":"user1",
        "members":{
            "user1":true,
            "user2":true
        },
        "created":true,
}

如果我理解正确,为什么 newData.child('members').exists() returns 错误?

我也测试了 newData.hasChild('members')newData.hasChildren(['members']) 但都给出了相同的结果(错误)。

提前致谢

您应该传递更新请求数据中指定 path/locations 中应该包含的确切 JSON。

因此更新聊天的位置将是:chats/{chatId} 和 data/payload,如下所示:

{
  "uid": "1d771b40-917c-11ec-b57d-a55c6126c658",
  "name": "",
  "updatedAt": 1645272534466,
  "createdAt": 1645272279796,
  "senderID": "user1",
  "members": {
    "user1": true,
    "user2": true
  },
  "created": true
}