2016-03-21 15 views
0

Firebaseの子供にデータキャップを設定する方法はありますか?私の特定の例子供のFirebaseデータキャップ

例えば。、...

{ 
    Customer1: {}, 
    Customer2: {}, 
    Customer3: {} 
} 

、顧客の支払いモデルに応じて、それらが使用することを許可されているどのくらいのスペースが決まります。 Customer1とCustomer2について言えば、使用されるスペースは最大25MBだけです。新しいデータは古いデータを削除するか、まったく追加されません。

特定の顧客については、全データセットのサイズを確認し、顧客が一定量を超えた場合に新しいデータを追加しないようにする必要がありますか?

+0

現時点では、私はこの質問が少し広いと思います。あなたはクライアントまたはサーバー側のキャップをしますか?それは固定されたキャップですか、それとも動的ですか?これまでに試したことを追加できますか? [mvc](http://stackoverflow.com/help/mcve)と[ヘルプセンター](http://stackoverflow.com/help/on-topic)をご覧ください –

+0

私は質問があいまいであることを認めます。申し訳ありません。データは動的である(顧客の会員資格に応じて)。私はセキュリティのルールを使ってこれを実装する方法があるかどうかを確認しようと多くの時間を費やしました。 –

+0

これを行うための答えをFirebaseセキュリティルールだけで追加しました。完璧な解決策ではないかもしれませんが、改善できる可能性があります。 –

答えて

0

これは、ユーザーがそれらを回避することができるようになりますよう、あなたがクライアント側のアプリケーションに実装することはできません、これらの要件の一つである...正直に言うと理想的なソリューションのように見えるしていません。もし、するなら。

代わりにあなたが残した、このサーバ側を実装する必要があります。

  • 何オペレータビルトインはありませんサーバー側のコードで

それを実装するセキュリティルール

  • でそれを実装Firebaseセキュリティノードのサイズを指定するルール。あなたは文字列の長さを知ることができますが、これはやや難しいです。

    したがって、サーバー側のプロセスは、クライアントのデバイス上で実行されない制御するプロセスです。そのサーバー側のプロセスでは、どのような方法でノードのサイズを計算することができます。

    プロセスは、ノードサイズをFirebaseに安全な場所(プロセスだけが書き込むことができる)に書き戻します。セキュリティルールは、この場所に対してチェックし、ノードがクォータより大きい場合に書き込みを拒否することができます。

  • +0

    これはセキュリティルールでは実行できませんか?個人的には、サーバーサイドのコードを使用せずに悪用の可能性を制限したいと思います。データストアと転送のファイアベースの制限を超えたときに支払う必要があるので、これをチェックするオプションがあると思います。 –

    +0

    私はすぐに方法を理解できませんでした。しかし、私はこれがセキュリティルールで純粋にどのように行われるのかについての提案はしていません。 –

    +0

    私はサーバー側以外の実装を望んでいました。私が最初にしたことの1つは、Securityのドキュメントを見ていたのですが、データサイズに関しては何も見つかりませんでした。 –

    1

    いくつか試行錯誤した結果、Firebaseセキュリティルール内のデータに上限を設定することが実際に可能であることが分かりました。 しかし、ある程度まで延長!

    制限要因は、プリミティブ型(文字列、数値またはブール)の値のみをチェックできることです。ノードに子がある場合は、それぞれの子の値をチェックする必要があります。これは、どのデータが期待できるかを知ることを意味します。

    以下は、これを達成するために必要なセキュリティルールの例です。このルールは、プリミティブ型または最大3つの(指定された)プリミティブ子を持つノードのみに適用されます。

    "rules": { 
        ".read": true, 
        ".write": true, 
        "$key":{ 
        //validate that the data has no children 
        ".validate":"(!newData.hasChildren() && 
        //and validate if it is a string within a certain length 
        (newData.isString() && newData.val().length < 10) || 
        //or validate if it is a number within a certain range 
        (newData.isNumber() && (newData.val() < 10 && newData.val() > -10)) || 
        //or validate if it is a bool 
        newData.isBoolean()) || 
        //Or rince and repeat for all possible child nodes 
        newData.hasChildren()", 
        "childA":{ 
         ".validate":"(!newData.hasChildren() && 
         (newData.isString() && newData.val().length < 10) || 
         (newData.isNumber() && (newData.val() < 10 && newData.val() > -10)) || 
         newData.isBoolean())" 
        }, 
        "childB":{ 
         ".validate":"(!newData.hasChildren() && 
         (newData.isString() && newData.val().length < 10) || 
         (newData.isNumber() && (newData.val() < 10 && newData.val() > -10)) || 
         newData.isBoolean())" 
        }, 
        "childC":{ 
         ".validate":"(!newData.hasChildren() && 
         (newData.isString() && newData.val().length < 10) || 
         (newData.isNumber() && (newData.val() < 10 && newData.val() > -10)) || 
         newData.isBoolean())" 
        }, 
        //dismiss all child nodes you don't want 
        "$other": {".validate": false} 
        } 
    } 
    

    このsollutionについての欠点のいくつかは、次のとおりです。

    1. あなたが期待する(そして、あなたのルールこれは変更するたびに更新する)ことができるかのデータを知っている必要があり
    2. ルールは指数関数的に大きくなりますあなたが持つことができるより多くの子ノード
    3. 実際には、ノードに「合計」上限はありませんが、ノードを構成するプリミティブ上にしかありません。たとえば(childA + childB + childC)が小さければ、Xは不可能です。
    4. ダイナミックキャップは使用できません。しかし、あなたはlocationFreeが10の上限を持ち、locationPremiumは100の上限を持っていると言うこともできます。しかし残念ながら、これは必要なルールの量を2倍にし、ユーザーは上限に応じて書き込み位置が異なります。
    +0

    良いもの!それは本当にうまくいくだろうが、現実的な木のサイズが実現可能かどうかは疑問だ。あなたがアグリゲータを生成するためにボルトを使用できるかどうかは疑問です。そして、私はルールの大きさがどんなものかさらに疑問に思います。 :-) –

    関連する問題