web-dev-qa-db-ja.com

Firebase Firestoreセキュリティルールを設定して、ユーザーだけが自分のデータをCRUDできるようにし、それ以外はすべて無視されるようにする

私は、Googleを介して認証されたユーザーが「ソーシャル」機能のない自分のデータにのみアクセスできるように設計されたアプリを持っています。以下の基準のセキュリティルールを知りたい。

5つのコレクションがあり、そのうちの1つが「todos」と呼ばれ、認証されたユーザーuidのフィールドがあるという点で、データが他のコレクションをミラーリングするとします。典型的なドキュメントは次のようになります。

Todos

todo:{
  title:"some titled",
  body:"we are the world , we are the children",
  uid:"2378y4c2378rdt2387btyc23r7y"  
}

他のいくつかのコレクション

thing:{
  name:"some name",
  content:"Some content",
  whatever:"whu-eva",
  uid:"2378y4c2378rdt2387btyc23r7y"  
}

認証されたGoogleユーザーが、uidフィールドにユーザーuidと言ったデータをCRUDできるようにしたい。ログインしているユーザーが他のすべてのデータにアクセスできないようにしたい。

このシナリオのルールを作成する方法を知りたい。

今、ドキュメントを検討していますが、質問することで時間を節約できるかもしれません。アプリに特定の役割はありません。 https://firebase.google.com/docs/firestore/solutions/role-based-access

補足として、認証されたGoogleユーザーのuidを、ログイン中に作成されたドキュメントに自動的にバインドする機能はFirebaseにありますか? (私は答えがノーであると想定しており、私は自分のアプリでuidを手動で取得し、ドキュメントを作成する前にクライアントでそれを設定することを計画していました)。

ありがとうございました。

更新

Klugjoが以下に投稿したコードを使用してみました。

シミュレータでテストしようとすると、エラーが発生します。

これが私のコレクションとエラーのスクリーンショットです。

enter image description here

enter image description here

ここに私が試した他のものがあります: enter image description here

私が読んだすべてに基づいて、次のコードは機能するようです-しかし、機能しません。この投稿の上部にあるオブジェクトデータに記述されている「uid」の代わりに「userId」というキーを補足しました。 uidと区別するためにキーを変更しました。

service cloud.firestore {
  match /databases/{database}/documents {
    match /todos/{id} {
    allow read: if request.auth.uid == request.resource.data.userId;
    allow create, update, delete:
        if request.resource.data.userId == request.auth.uid;
      }
    }
  }

ドキュメントを取得および作成しようとするビデオを作成しました。テスト機能を正しく使用しているとは思いません。

ビデオ

https://www.youtube.com/watch?v=W7GZNxmBCBo&feature=youtu.be

[〜#〜]編集[〜#〜]

ハードコードされたrequest.auth.uidを使用してテストすると、問題なく機能します。下の画像では、「テスト」をrequest.auth.uidとしてハードコーディングしています。

私の問題は、この情報をハードコーディングせずにルールエディターでテストする方法を知りたいということです。

enter image description here

編集

これは、実際のアプリを使用した問題のビデオデモです。

https://www.youtube.com/watch?v=J8qctcpKd4Y&feature=youtu.be

6
William

あなたはこのようなものを探しています

service.cloud.firestore {
  match /databases/{database}/documents {
    match /todos/{userId} {
      allow read, update, delete: if request.auth.uid == userId;
      allow create: if request.auth.uid != null;
    }
  }
}

match /todos/{userId}は、ルール条件でuserId変数を使用できるようにします

request.auth.uidは認証されたユーザーに一致しますuid

0
klugjo