2016-07-12 6 views
1

私は自分のアプリケーションにメッセージのリストを持っています。私は自分のメッセージのリストを検索したいと思います。読み取りアクセス権を持つ子どもをリストすることを許可するデータベースルール

私はで「USER1」私は何の問題もなく/メッセージ/メッセージ1をフェッチすることができますが、私は(他のユーザーのメッセージへのアクセスを取得できずに)すべての私のメッセージを取得する場合としてログインしていた場合/ messages/子要素の一部にアクセスしても権限が拒否されます

メッセージのIDを知らずに、読み取り権限を持つすべての子要素のリストをユーザーに与える方法を教えてください。

ありがとうございます。以下は

は私のデータベースです:

{ 
    "messages" : { 
    "message1" : { 
     "sender" : "user1_uid" 
     }, 
    "message2" : { 
     "sender" : "user1_uid" 
    } 
} 

そして、ここで私のルールです:私はあなたが文句を言わないあなたのため.orderByChild('sender').equalTo(user_uid)を使用することができるので、あなたが期待しているものを達成するためにリファクタリングをお勧めします

{ 
    "messages": { 
     "$weddingId": { 
      ".read": "data.child('sender').val() == auth.uid" 
     } 
    } 
} 

答えて

1

Adolfoには有効なアプローチが1つあります。ユーザー固有のノードの下にメッセージデータを展開します。これは、NoSQLデータベースでは非常に一般的です。大規模なものではなく、多数の「メッセージのミニテーブル」を構築しています。

また、あなたはそれが今あるメッセージのマスターリストを保持しますが、ユーザーごとにメッセージのいわゆるインデックスを作成することができます:あなたはあなたのようmessagesのためのセキュリティ規則を維持したい

{ 
    "messages" : { 
    "message1" : { 
     "sender" : "user1_uid" 
     }, 
    "message2" : { 
     "sender" : "user1_uid" 
    } 
    }, 
    "user_messages": { 
    "user1_uid": { 
     "message1": true, 
     "message2": true 
    } 
    } 

ここでそれらを持っていますが、新しいuser_messagesインデックスのためにこれらを追加します。場所にこれらにより

"user_messages": { 
    "$userId":{ 
    ".read": "$userId == auth.uid" 
    } 
} 

、最初/user_messages/<authData.uid>からメッセージIDをロードし、その後から、個々のメッセージをロードすることにより、ユーザのためのメッセージを読み込みたいです。

さらに、この手法(ファンアウトと呼ばれる)については、guide on creating data that scalesも参照してください。

2

/messagesブランチへの読み取りアクセス権を与えていません(子のみ)。

/messagesのブランチとしてuserIdを持っていて、その中にすべてのプレーヤメッセージIDを持つように作業することができます。あなたは怒鳴るようなデータをあなたのメッセージを保存する必要があります。

{ 
    "messages" : { 
    "userId" : { 
     "message1" : { 
      "text": "tetet" 
     }, 
     "message2" : { 
      "text" : "tetet2" 
     } 
    }, 
    "userId2": {...} 
} 

次に、あなたのルールは次のようになります。

{ 
    "messages": { 
     "$userId":{ 
      ".read": "$userId == auth.uid", 
      "$weddingId": { 
       //... 
      } 
    } 
} 

最後に、あなたが持つすべてのユーザーのメッセージを持つことができるようになります:

firebaseRef.child('messages').child(user_uid).once('value', function(snapshot) { 
    if (snapshot.val()){ 
     console.log(snapshot.val()); 
    } 
}) 
+0

ありがとうございました。私は、 "送信者"が複数のユーザーIDを持ち、後で追加できる送信者が増えていると言わざるを得ない。これを容易にする方法を考えることができるだろうか? – larsd

+0

@larsdあなたは単にすべての適切なユーザーにもmessageIdを追加する必要があります。 – adolfosrs

関連する問題