いくつか試行錯誤した結果、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についての欠点のいくつかは、次のとおりです。
- あなたが期待する(そして、あなたのルールこれは変更するたびに更新する)ことができるかのデータを知っている必要があり
- ルールは指数関数的に大きくなりますあなたが持つことができるより多くの子ノード
- 実際には、ノードに「合計」上限はありませんが、ノードを構成するプリミティブ上にしかありません。たとえば(childA + childB + childC)が小さければ、Xは不可能です。
- ダイナミックキャップは使用できません。しかし、あなたはlocationFreeが10の上限を持ち、locationPremiumは100の上限を持っていると言うこともできます。しかし残念ながら、これは必要なルールの量を2倍にし、ユーザーは上限に応じて書き込み位置が異なります。
現時点では、私はこの質問が少し広いと思います。あなたはクライアントまたはサーバー側のキャップをしますか?それは固定されたキャップですか、それとも動的ですか?これまでに試したことを追加できますか? [mvc](http://stackoverflow.com/help/mcve)と[ヘルプセンター](http://stackoverflow.com/help/on-topic)をご覧ください –
私は質問があいまいであることを認めます。申し訳ありません。データは動的である(顧客の会員資格に応じて)。私はセキュリティのルールを使ってこれを実装する方法があるかどうかを確認しようと多くの時間を費やしました。 –
これを行うための答えをFirebaseセキュリティルールだけで追加しました。完璧な解決策ではないかもしれませんが、改善できる可能性があります。 –