2017-10-05 9 views
4

Firebase Realtime Databaseのセキュリティルールについては、次のルールなどを使用して、パブリックデータとプライベートデータが同じツリーに存在することがあります。Firestoreセキュリティルール

しかし、Firestoreを使用すると、取得できるデータのチャッキングがコレクションまたはドキュメントの下にあるため、同じことをすることはできません。 パブリックとプライベートのデータが同じドキュメントに定義されていて、コレクション/ドキュメントのデータを取得している場合、私たちが所有者でない場合、プライベートデータのパーミッションが不十分であるというエラーが発生します。

RTDBを使用している場合、コレクション/ドキュメントがないため、 'users/{userId}/publicInfo'のデータを取得できます。

FirestoreでRTDBを実行する方法はありますか?それ以外の場合は、公的/私的なコレクションを別々に持っているべきですか?

// rule of Firebase Realtime Database 
"users": { 
    "$user_id": { 
     ".read": "auth.uid === $user_id", 
     ".write": "auth.uid === $user_id", 

     "private": { 
      ".read": "auth.uid === $user_id" // --- private data 
     } 

     "public": { 
      ".read": "auth !== null";   // --- public data 
     } 
    } 
} 

// Firestore 
service cloud.firestore { 
    match /databases/{database}/documents { 
    match /users/{userId} { 

     match /{private=**} { 
     allow read, write: if request.auth == userId; 
     } 

     match /{public=**} { 
     allow read, write: if request.auth != null; 
     } 
    } 
    } 
} 

答えて

8

したがって、ドキュメントの別々の部分に対して個別のセキュリティルールを設定することはできません。ドキュメント全体を読むことも、できないこともあります。

つまり、あなたのuserIDドキュメントに、公開と非公開のドキュメントを含む「パブリック」と「プライベート」サブコレクションを提供したい場合、それはあなたが現在行うことのできるものです。あなたのセキュリティルールをアップしてください。

match /{private=**}」という言葉は、「プライベート」と呼ばれるサブコレクションに一致するわけではありません。つまり、「サブコレクションを一致させてから、privateという変数に割り当てる」という意味です。ドキュメントの「Recursive matching with wildcards」セクションで詳細を説明しています。

また、ユーザのIDを取得するには、request.auth.uidを参照する必要があります。

// Firestore 
service cloud.firestore { 
    match /databases/{database}/documents { 
    match /users/{userId} { 
     // You'll probably want to add security rules around the user document 
     // itself. For now, though, let's look at our subcollections: 

     match /private/{anything=**} { 
     // Only the user can read documents in their private collection 
     allow read, write: if request.auth.uid == userId; 
     } 

     match /public/{anything=**} { 
     // Anybody can read documents here, as long as they're signed in 
     allow read, write: if request.auth != null; 
     } 
    } 
    } 
} 
+0

どうもありがとう:

だから、あなたはおそらく、このようなより多くの何かをしたいです。 Firestoreを理解することで、これらの種類(公開/非公開)のデータを同じドキュメントに置かないようにすることができます。あなたが言ったように、可能な解決策はサブコレクションを持つことですが、これは私たちにドキュメントのキーを持つよう強制しますが、この場合は必要ありません。例えば/ users/{uidxx}/private/{uidyyy}/firstNameなどと同じですが、同じuidは許可されています。コレクションからデータを取得する場合、サブコレクションのデータは含まれていないことに注意してください。 –

+0

新しい文書を作成するときにキー自体を指定することもできます。あなたは/ users/{uidxx}/private_data/private/firstNameを持つことができ、うまくいくでしょう。また、パブリックデータ用の別のコレクションを用意する必要はないかもしれません。親ドキュメントにそのデータを保存することができます。 –

+0

再度、感謝します! –

関連する問題