2017-03-07 13 views
0

に子供のワイルドカード変数を参照することができ、はどのように私は私が作成していたiOSメッセージングアプリでFirebase

"messages": { 
     "$uid":{ 
      ".read": "auth.uid == $uid", 
      "$messageId":{ 

       // insert .write rule here 

       "toUid":{ 
        // if its a group message then there would be multiple "$toUid" children 
        "$toUid":{ 

        }, 
       }, 
       "fromUid":{ 
        "$fromUid":{ 

        } 
       }, 
       "timeStamp":{ 

       }, 
       "group":{ 
        "isGroupMessage":{ 

        }, 
        "groupId":{ 

        } 
       } 
      } 
     } 
    }, 

を次のようにメッセージノードの構成の概要がある私は、書き込みルールを追加したいと思います"$ toUid"または "$ fromUid"が$ uidと等しいことを保証する$ messageIdの後に。

どうすればいいですか? - 変更の構造が、私たちは今のところ使用するための最速/最も安全なセキュリティルールである

".write": "newData.child('toUid').hasChild($uid) || newData.child('fromUid').hasChild($uid)", 

**私は、以下の溶液を用いて行っている:

はそれを行うための最善の方法以下です。

MVPは当初はグループメッセージを持たない(無関係かもしれませんが、ロジックは異なる可能性があります)ので、代わりに "$ friendUid"というワイルドカードの子変数を追加し、その下に次のルールを設定することができます。

"$messageId":{ 
    "$friendUid":{ 
    ".write": "$uid == auth.uid || $friendUid == auth.uid", 
+1

リストに特定の値が含まれているかどうかをセキュリティチェックで確認することはできません。特定のキーが存在するかどうかだけを確認できます。したがって、最初の '.write'スニペットは確かに正しいアプローチのようです。あなたはそれに問題がありますか? –

+1

@FrankvanPuffelenは私がそれを感謝してくれたと思います。 "$ friendUid"ワイルドカード変数を追加してレイヤーを追加するつもりです。これは、私たちが最も簡単で最も安全な方法です。問題は、ユーザーが無関係であるラインの下の機能についてもっと考えていた:)(まだリリースされていない) – Edward

+1

良いエドワード。答えとしてあなたのソリューションを投稿できますか?スタックオーバーフローとあなたの評判を築く素晴らしい方法については、自己回答が推奨されます。 –

答えて

1

このように、メッセージノードのFirebaseデータベースルールを構造化することにしました。私は、 "$ friendUid"というワイルドカード変数を持つ余分な子ノードを追加しました。これを簡単に参照し、メッセージの分岐をロックダウンします。

"messages": { 
     "$uid":{ 
      ".read": "auth.uid == $uid", 
      "$messageId":{ 
       "$friendUid":{ 
        ".write": "$uid == auth.uid || $friendUid == auth.uid", 
        ".validate": "root.child('friends/'+$uid+'/'+$friendUid).exists()", 

        "toUid":{ 
         "$toUid":{ 
          ".validate": "$toUid == $friendUid || $toUid == $uid" 
         }, 
        }, 
        "fromUid":{ 
         "$fromUid":{ 
          ".validate": "$fromUid == $friendUid || $fromUid == $uid" 
         }, 
        }, 
        "timeStamp":{ 
         ".validate":"newData.isNumber()" 
        }, 
        "$other":{ 
         ".validate": false 
        } 
       } 
      } 
     } 
    }, 
関連する問題