Firebase.update()は、複数のノードをアトミックに更新するのに非常に便利です。ただし、セキュリティルールがupdate()
操作のルートノードによって依然として定義されているため、制限されているように見えます。私Firebaseセキュリティは次のように整理されupdate()呼び出しのための細かなFirebaseセキュリティ
users : {
uid : {account: accountId, ...},
...
},
accounts : {
accountId : {uid: uid, ....},
...
},
customers : {
customerId : {uid: uid, accountId: accountId...},
...
}
:たとえば、のは、私のデータが構成されているとしましょう
これらのノード間で与えられたbusinessIdのためのアトミック更新を行うには
{
"rules": {
"users" : {
"$uid" : {
".read": "data.child('account').val() === root.child('users').child(auth.uid).child('account').val()",
".write": "data.child('account').val() === root.child('users').child(auth.uid).child('account').val()"
}
},
"accounts" : {
"$accountId” : {
".read": "data.child('users').child(auth.uid).exists() || newData.child('users').child(auth.uid).exists()",
".write": "data.child('users').child(auth.uid).exists() || newData.child('users').child(auth.uid).exists()"
}
},
“customers” : {
"$customerId” : {
".read": "root.child('users').child(auth.uid).child('account').val() == root.child('customers').child($customerId).child('account').val()",
".write": "root.child('users').child(auth.uid).child('account').val() == root.child('customers').child($customerId).child('account').val()"
}
}
}
、私はので
firebaseRef.update({
accounts : {
accountId : { foo: bar },
},
customers : {
customerId : { foo: bar },
}
}
次のようなupdate()
電話をかけることができますは、指定された場所のみを変更すべきであり、ノードごとのセキュリティルールを適用することができる。 uid
を使用)。
FIREBASE WARNING: update at/failed: permission_denied
だから今、私が代わりにIを意味しているset()
を使用してシーケンス内の異なるノードを更新するために、約束のチェーンを使用しています:しかし、ルートセキュリティ(例えば/
)が優勢で、私のような警告が出ているようです原子操作を失う。
ルートのセキュリティを開かなくても、複数のノードにわたってアトミック操作を行うより良い方法はありますか?
上記の火災基地構造の規則を(テキストとして)掲載してください。 – Jay
こんにちはジェイ!返事が遅くなってごめん。私のアプリケーションは少し複雑すぎて完全なセキュリティルールを投稿することができず、問題を再現する簡単な方法を考えることができませんでした。しかし、一般に、すべての更新されたサブノードがセキュリティを通過する場合、ルートノード上でupdate()呼び出しが機能する必要がありますか?もしそうなら、おそらく今私のために不正なセキュリティ設定になっているでしょう。 –
問題を解決しましたか? – Ymmanuel