0

Firebase セキュリティが思い通りに機能することに頭を悩ませています。私のアプリは Ember でビルドされているので、EmberFire でビルドされています。したがって、構造は EmberFire によって決定されます。

私のデータベース構造は次のとおりです。

conversations : {
    $conversation_id {
        messages {
            //message data
        }
        users {
            $user_id1 :true
            $user_id2 :true
        }
    }
}

私が望むのは、会話の一部であるユーザーだけがこの会話でメッセージを見たり書いたりできることです。私は成功せずにこのルールを試しました:

"conversations" : {
    ".indexOn" : "notify",
    ".read" : "auth !== null && root.child('users').hasChild(auth.uid)", 
    ".write": "auth !== null && root.child('users').hasChild(auth.uid)"
}

hasChild に auth.uid を渡すことができないようです。私の会話IDは会話に参加するユーザーIDの結合であるため、次のことも試しました。

"conversations" : {
   ".indexOn" : "notify",
   "$conversation" : {
       ".read" : "auth !== null && ($conversation.beginsWith(auth.uid) || $conversation.endsWith(auth.uid))", 
       ".write": "auth !== null && ($conversation.beginsWith(auth.uid) || $conversation.endsWith(auth.uid))"
   }
}

このルールでは、"conversations" ノードに .read ルールがないため、誰も会話を見ることができません。しかし、「.read : true」を「conversations」ノードに追加すると、Firebase のトップ ボトム ルールにより、すべてのユーザーがすべての会話を見ることができます。

編集: 2 番目のルールには、最初のルールと同じ問題があります。beginWith() には文字列引数が必要です。そして auth.uid は使用できません 私の問題を解決するためのアイデアはありますか?

編集 : ルールの前に auth !== null を追加すると、エラー startsWith() が文字列引数を期待するようになります。しかし、両方のルールはまだ機能しません。

4

1 に答える 1

4

最初の試行の問題は、ルートを使用していたが、$conversation を使用する必要があったことです。Root は、firebase のルートを参照するルール スナップショットですが、$conversation は、読み書きしようとしている会話の ID を保持する変数です。

"conversations" : {
       ".indexOn" : "notify",
       "$conversation" : {
           ".read" : "auth !== null && root.child('conversations/'+$conversation+'/users').hasChild(auth.uid)", 
           ".write": "auth !== null && root.child('conversations/'+$conversation+'/users').hasChild(auth.uid)"
       }
    }
于 2016-02-24T16:01:12.220 に答える