如何使用Firebase保护简单的分类帐类型应用程序?

时间:2016-10-01 07:13:34

标签: firebase firebase-realtime-database firebase-security

我正在开发一个维护交易分类帐的简单应用程序。

我的数据如下:

{
    "payments": {
        "user1": {
            "payment1": {
                "amount": 2,
                "timestamp": 1475303826
            }
        }
    },
    "purchases": {
        "user1": {
            "purchase1": {
                "amount": 0.25
                "timestamp": 1475303735
            },
            "purchase2": {
                "amount": 1.99
                "timestamp": 1475303792
            }
        }
    },
    "users": {
        "user1": {
            "balance": -0.24
        }
    }
}

每当我添加付款时,我希望用户的余额增加,当我添加购买时,我希望余额减少。

有没有办法设置Firebase规则,以便用户的余额始终等于其购买和付款的总和?

修改

根据Frank van Puffelen的回答,我设法制定了这些规则:

"purchases": {
  "$uid": {
    "$pid": {
      ".validate": "!data.exists() && (newData.parent().parent().parent().child('users/'+$uid+'/balance').val() == root.child('users/'+$uid+'/balance').val() - newData.child('amount').val())"
    }
  }
},
"payments": {
  "$uid": {
    "$pid": {
      ".validate": "!data.exists() && (newData.parent().parent().parent().child('users/'+$uid+'/balance').val() == root.child('users/'+$uid+'/balance').val() + newData.child('amount').val())"
    }
  }
}

这些确保任何新的购买或付款都伴随着对用户余额的匹配更新。

我现在正试图制定一些规则,以防止在不添加购买或付款的情况下更改余额。我有想法为用户的余额添加规则,以验证在更新期间,只有一个新购买或付款,但我认为没有办法使用规则DSL计算节点的子节点。 / p>

1 个答案:

答案 0 :(得分:1)

无法表达值必须是安全规则中所有其他值的总和。这本质上是一种不可扩展的操作,因为它需要评估每次更新的所有数据。

最近我能想到的是一个系统,您可以在其中评估每次更新的当前余额,交易金额和新余额。所以(非常简化)类似的东西:

newData.child("balance").val() == data.child("balance").val() - data.child("amount").val()

这个解决方案与我前一段时间的做法非常接近,以确保voteCount和选民名单保持同步。见Is the way the Firebase database quickstart handles counts secure?