firebase数据库规则允许在特定节点上写入

firebase数据库规则允许在特定节点上写入,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我有以下数据库: actions : [ { "added" : 1535293085383, "countdown" : 9999999999, "item" : 1, "type" : "a" }, { "added" : 1535293085383, "countdown" : 999999999, "extra" : "bb", "item" : "2", "type" : "b" }, { "added" : 1635293085383,

我有以下数据库:

actions : [  {
  "added" : 1535293085383,
  "countdown" : 9999999999,
  "item" : 1,
  "type" : "a"
}, {
  "added" : 1535293085383,
  "countdown" : 999999999,
  "extra" : "bb",
  "item" : "2",
  "type" : "b"
}, {
  "added" : 1635293085383,
  "countdown" : 1,
  "item" : 3,
  "type" : "c"
}]
我希望任何登录的用户都能够读取所有数据,但只能写入倒计时节点

我的想法是,每次用户读取数据时,都会减小该值,但不允许他们更新任何其他节点

这是我写的规则

    {
       "rules":{
          ".read":false,
          ".write":false,
          "actions":{
             ".indexOn":[
                "added"
             ],
             ".read": "auth != null",
           "countdown":{
             ".write" : "auth != null"
           }
          }
}
它拒绝从未经身份验证的用户处读取
它允许从经过身份验证的用户处读取数据
即使在倒计时节点中,也无法从经过身份验证的用户处写入


如何修复它

您的安全规则缺少一个级别。现在您允许写入
/actions/countdown
。但您希望允许写入
/actions/*/countdown
。要捕获该需求,请在规则中使用
$
变量:

{
   "rules":{
      ".read":false,
      ".write":false,
      "actions":{
         ".indexOn": [ "added" ],
         ".read": "auth != null",
         "$actionid": {
           "countdown":{
             ".write" : "auth != null"
           }
         }
      }
}
现在,由于
$actionid
的原因,这里的
倒计时/.write
规则适用于
/actions
的每个子节点