Firebase 规则——多个默认值

Firebase Rules -- Multiple Default Values

我的 firebase 中有一个 parent 作为 'Client'。然后是'invoices'的child,然后是发票上的children

'clients' {
    'uid' {
       'invoices' {
          'number': '1003 //etc...
          'payments' {

           }
           'history' {

           }
           'discussion' {

           }
       }
    }
 }

我试图只允许客户写入付款、历史记录和讨论。但是当我执行以下操作时,我在 Firebase 仪表板规则部分中收到错误 Cannot have multiple default rules ('$payments' and '$history').

"clients": {
      ".write" : "root.child('roles').child(auth.uid).child('level').val() == 4",
      ".indexOn" : "number",
      "$estimates": {
        "$discussion": {
          ".write": "root.child('roles').child(auth.uid).child('level').val() == 2"
        }
      },
      "$invoices": {
        "$payments": {
          ".write": "root.child('roles').child(auth.uid).child('level').val() == 2"
        },
        "$history": {
          ".write": "root.child('roles').child(auth.uid).child('level').val() == 2" 
        },
        "$discussion": {
          ".write": "root.child('roles').child(auth.uid).child('level').val() == 2"
        }
      }
    },

那么这些规则的正确写法是什么?

您的 JSON 规则树似乎遗漏了一些级别。

"clients": {
   "$clientid": {
      ".write" : "root.child('roles').child(auth.uid).child('level').val() == 4",
      "invoices": {
         ".indexOn" : "number",
         "$invoiceid": {
            "payments": {
               ".write": "root.child('roles').child(auth.uid).child('level').val() == 2"
            },
            "history": {
               ".write": "root.child('roles').child(auth.uid).child('level').val() == 2" 
            },
            "discussion": {
               ".write": "root.child('roles').child(auth.uid).child('level').val() == 2"
            }
         }
      },

对于需要应用于节点下所有非其他匹配子项的规则,您应该只使用 $ 变量。

因此,如果您将所有付款保留为 payments 节点的子节点并希望为它们指定特定的验证规则,您可以:

            "payments": {
               ".write": "root.child('roles').child(auth.uid).child('level').val() == 2",
               "$paymentid": {
                  ".validate": "..."
               }
            },