1
何らかの理由で、.hasChild(newData.child('ownerId').val())
で検証する必要があるプロパティを持たないオブジェクトを書き込もうとすると、次のセキュリティルールがfalse
に解決されています。プロパティは必須ではないので、私はそれなしで書き込みを受け入れるようになっています。怒鳴るようなコードを実行するときにセキュリティルール「hasChild()|| true」がfalseに解決されましたか?
"pizza": {
"$pizzaId": {
".write": "root.child('users').hasChild(newData.child('ownerId').val()) || true"
}
}
したがって、私はPERMISSION_DENIED
を取得しています:
firebase.database().ref(`pizza/peperoneID`).set({
extraPepe: true
});
私はちょうど(newData.child('ownerId').exists() && .hasChild(...)) || true
に行くことによってそれを修正することができます知っているが、私は本当に理解しようとしていますなぜ最初の選択肢では不十分なのですか?
返信cartantに感謝します!私はそう仮定していたが、なぜこの状況で 'hasChild()'が 'false'を返してもらえなかったのだろうか?少なくとも私の '' .write "'文が偽を返すというだけでなく、少なくともより良いエラーメッセージがありました。 :/ Fireabase secルールは最も単純なものではなく、アプリケーションに複雑さを加えるとロジックが大きくなりがちですが、この事前チェックに対処するだけで最悪になります。 – adolfosrs
これは実装されたばかりなので、 ['hasChild'](https://firebase.google.com/docs/reference/security/database/#haschildchildpath)は文字列を受け取り、あなたは' null'を渡しています。エラーが発生した場合にアクセスを拒否することは、アクセスを許可するよりも意味があるためです。非特定のエラーメッセージをクライアントに提示する方が良いからです。あなたがしたように、またはあなたが行っているように、あなたのルールをテストすることになっているからです。 – cartant