1

Firebase Securityについて混乱しています。ここになぜ...Firebaseセキュリティ - 共有データ

たとえば、私は次のデータベースを持っています:

clients: { 
    $key: { 
     //client data 
    } 
} 

trainer: { 
    $key: { 
     //trainer data 
    } 
} 

自分自身の情報を見るにはクライアントが必要です。私はすべてのクライアントの情報を見ることができるトレーナーが必要ですが、他のトレーナーは知りません。

したがって、クライアントA、BおよびCは、個人的な個人データを見ることができます。しかし、トレーナーAはクライアントAとBの詳細しか見ることができません(彼はCを訓練しません)。

私が遭遇する問題は、すべてのクライアントを要求するようなことはできませんが、セキュリティルールでチェックアウトしたクライアントだけを返すように見えるということです。ドキュメントの状態として、リスト内のfalseがfalseを返すと、束全体が返ります。

正しい構造とセキュリティルールを作成するにはどうすればよいですか?

答えて

0

Firebaseのドキュメント(https://firebase.google.com/docs/database/security/user-security)の例に似ていますが、これが役立つかもしれません。

少なくとも、あなたの構造はクライアントとトレーナーの間の直接的なキーのつながりから利益を得ることができると思います。

clients: { 
    clientA: { 
     trainerKey: "trainerA" 
    } 
} 

trainers: { 
    trainerA: { 
     clients: { clientA: true, clientB: true } 
    } 
} 

セキュリティの規則のようなもの -

"clients": { 
    ".read": "auth !== null && (root.child('trainers/' + $trainerKey + '/clients').child($uid).exists() || auth.uid == $uid") 
} 

ユーザーを含めるように編集これは、a)は、ユーザーが認証されていることを確認し、b)は、クライアントがためのクライアントのリストにあるかどうかを確認しますトレーナーか、これがクライアントかどうか。

これはテストされていませんが、うまくいけばどこに行こうとしています。あなたのクライアントIDが認証IDと同じであることを前提にしています。

+0

提案していただきありがとうございます。私はこれとほぼ同じことを試してきましたが、それをやり遂げます。確かに、 'trainerA'が持っていないクライアントがあれば、これは失敗しますか?ルールが任意のチェックでfalseを返した場合、結果全体はゼロになります。 –

+0

はい、そうすべきです。これはテストされていないため、現在の状態では動作しない可能性があります。それは、概念的には、少なくともあなたが必要とするものにあなたを近づけるはずです。 – dstepan

+0

私はその考えを感謝します。どのようにして 'clients'ですべてのデータを要求することができますか? –

0

あなたは、友達としてトレーナーにクライアントを追加するようなものを含めるべきです。子としてトレーナーが含まれている共有ノードを作成し、トレーナーにAクライアントと鍵のデータが含まれています(&)。

+0

あなたのお返事ありがとうございます。しかし、これは多くの重複データで終了しませんか? –

+0

データを複製するのは簡単なアプローチで、どのFirebaseエンジニアも提案したものです。あなたfirebaseによって提供される例のチャットアプリのjsonファイルを見てください。デュプリケーションでは、単一のノード内に大量のデータを保存するのではなく、データの非正規化を維持します。ロードに時間がかかり、アプリケーションのリアルタイムパフォーマンスに影響します –

関連する問題