2016-12-19 4 views
2

私は参加のリストが含まれていチャットのセットを持ってしようとし、そして、ユーザーごとにユーザーが参加あるチャットのリストを照会することができています。Firebaseルールはフィルタではないので、どのようにフィルタリングしますか?

サーバ側ではフィルタリングができません(スケーラビリティのためだと思います)、私が必要とする「フィルタリング」の各形式のリソース内のすべてのデータを準備する必要があることを理解しました。今の構造:

database structure screenshot

ものは、私は、データを保護するために書いたルールは以下のとおりです。

{ 
    "rules": { 
    "users": { 
     "$user_id" : { 
     "chats" : { 
      ".read":"auth != null && $user_id == auth.uid", 
      ".write": "auth != null && !data.exists()" 
     } 
     } 
    }, 
    "chats": { 
     "$chatId": { 
     ".read":"auth != null && root.child('users').child(auth.uid).child('chats').child($chatId).exists()", 
     ".write": "auth != null && !data.exists()" 
     } 
    } 
    } 
} 

最初のルール(/ユーザー/ &のuser_id /チャット)がOKであると意図したとおりに動作します。私はuser_idでクエリを実行し、ユーザーがアクセスする必要があるすべてのchat_idsのマップを取得できます。

二番目のルールは私がchat_idだったが、私が実際に持っていることはUIDとしてchat_idを持つ属性を含むオブジェクトのidである、と私は子供に得ることができないと思ったものをので失敗そのIDを知らなくても、rules are not filtersとなります。

私がチャットを保護することができる唯一の方法は、参加者のリストの文字列を使用して、そのチャットの子にcontains()を使用して、ユーザーが参加していないそのチャット。

別の方法がありますか?それは行く方法ですか?

答えて

2

"uid"キーでチャットのIDを設定するために新しいキーを押すのではなく、/users/<uid>/chatsの子としてチャットのキーを直接設定することができます。値はtrueです。

{ 
    "users": { 
     "<uid>": { 
      "chats": { 
       "<chat_id>" : true, 
       "<chat_id2>" : true 
      } 
     } 
    } 
} 

この構造では、適切なユーザーに対して、読み取りアクセスのFirebaseデータベースのルールが真である必要があります。

関連する問題