2016-10-01 7 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

これは私の問題の半分を解決するのに役立ちました。私は自分の進捗状況を編集しました。 –

関連する問題