2017-05-13 7 views
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に行くことによってそれを修正することができます知っているが、私は本当に理解しようとしていますなぜ最初の選択肢では不十分なのですか?

答えて

1

ownerIdがない場合は、hasChildに電話するとnullとなります。

エラーが発生し、ルールに失敗してエラーが表示されるので、末尾の|| trueは無効です。

+0

返信cartantに感謝します!私はそう仮定していたが、なぜこの状況で 'hasChild()'が 'false'を返してもらえなかったのだろうか?少なくとも私の '' .write "'文が偽を返すというだけでなく、少なくともより良いエラーメッセージがありました。 :/ Fireabase secルールは最も単純なものではなく、アプリケーションに複雑さを加えるとロジックが大きくなりがちですが、この事前チェックに対処するだけで最悪になります。 – adolfosrs

+0

これは実装されたばかりなので、 ['hasChild'](https://firebase.google.com/docs/reference/security/database/#haschildchildpath)は文字列を受け取り、あなたは' null'を渡しています。エラーが発生した場合にアクセスを拒否することは、アクセスを許可するよりも意味があるためです。非特定のエラーメッセージをクライアントに提示する方が良いからです。あなたがしたように、またはあなたが行っているように、あなたのルールをテストすることになっているからです。 – cartant

関連する問題