2016-06-25 4 views
1

Firebaseプラットフォームを使用して簡単なChatアプリケーションを開発しようとしています。私が使用している会話のリストを表示するにはFirebaseRecyclerAdapterです。事は、ルールを正しく設定して、ユーザーがメンバーになっている会話にしかアクセスできないようにする方法がわからないということです。FirebaseRecyclerAdapterを使用したFirebaseルールの構造

これは私のFirebase DBの構造です。

{ 
    "conversations": { 
     "cid1": { 
      "title": "Conversation1" 
     }, 
     "cid2": {... 
     }, 
     "cid3": {... 
     } 
    }, 
    "members": { 
     "cid1": { 
      "uid1": true, 
      "uid2": true 
     }, 
     "cid2": {... 
     }, 
     "cid3": {... 
     } 
    }, 
    "users": { 
     "uid1": { 
      "name": "User1" 
     }, 
     "uid2": {... 
     }, 
    } 
} 

これは私が適用しようとしているルールです。このルールを適用すると、私はこのエラーを取得していFirebaseRecyclerAdapterを使用することにより

{ 
    "rules": { 
     "conversations": { 
      "$conversation_id": { 
       ".read": "root.child('members').child($conversation_id).child(auth.uid).exists()", 
      } 
     }, 
    } 
    } 

Listen at /conversations failed: DatabaseError: Permission denied

私は、ユーザーが会話要素ではなく、会話の全体リストに読み取ることが可能だからだと仮定します。誰でもこの問題を解決する方法を知っていますか?

+0

「mid1」、「mid2」とは何ですか? – adolfosrs

+0

アクセスするために使用しているコードを確認する必要があります。 – adolfosrs

+0

@adolfosrs:それはユーザーIDであるはずです。構造を編集しましたので、今はより意味をなさないことを願っています。 –

答えて

0

Firebaseのセキュリティルールの落とし穴の1つとして、セキュリティルールを使用してデータをフィルタリングすることはできません。

あなたのリストアダプターは/conversationsを聞いています。その読み取り操作は、ユーザーが/conversationsの読み取り許可を持っているかどうかに基づいて、全体的に成功または失敗します。

/conversationsに対して読み取り権限を付与していないため、リスナーはキャンセルされます。これはドキュメントにRules Are Not Filtersとして知られており、covered frequently here on Stack Overflow(これは一般的な落とし穴なので)です。最も古くて最高の答えの1つとして、Restricting child/field access with security rules

関連する問題