2016-10-01 31 views
1

我正在研究一个维护交易分类账的简单应用程序。如何使用Firebase保护简单分类帐类型应用程序?

我的数据是这样的:

{ 
    "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规则,以便用户的余额总是等于其购买和付款的总和?


编辑

继弗兰克面包车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对节点的子项进行计数。

回答

1

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

最近我能想到的是一个系统,您可以评估每次更新的当前余额,交易金额和新余额。所以(极简)是这样的:

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

该解决方案是接近我做了,而前确保一个voteCount和选民的列表保持同步。请参阅Is the way the Firebase database quickstart handles counts secure?

+0

谢谢,这帮助我解决了一半问题。我用我的进步编辑了我的问题。 –