web-dev-qa-db-ja.com

アクセスルールのフィールドを使用してFirestoreに書き込むときの権限がないか、不十分です

Firestoreに書き込もうとするとエラーが発生します。

セキュリティルールにユーザーuidを含むフィールドを使用しようとしています。

service cloud.firestore {
  match /databases/{database}/documents {

    match /messages/{document=**} {
      allow read: if resource.data.user_uid == request.auth.uid;
      allow write: if resource.data.user_uid == request.auth.uid;
    }
  }
}

Firestoreデータベースにデータがある場合、読み取りルールは正常に機能しますが、書き込みを試みると、次のようになります:Error: Missing or insufficient permissions.この書き込みルールに問題があるのですか

追伸ルールをこれに変更すると、データベースに書き込むことができますが、これは私の目的には十分ではありません:

 match /messages/{document=**} {
      allow read: if resource.data.user_uid == request.auth.uid;
      allow write: if request.auth != null;
    }
23
Leo Farmer

resource.dataはすでに保存されているデータを参照するため、ユーザーのルールでは、ユーザーは既にユーザーIDを含むデータのみを更新できます。

おそらく確認したいのは、request.resource.dataで、これは入ってくる新しいデータです。

これらのフィールドと他のセキュリティルールに関するかなり広範なドキュメントがここにあります: https://firebase.google.com/docs/firestore/security/rules-conditions

18
Scarygami

この質問と受け入れられた答えは私にとって非常に役に立ちました。最終的には、他の誰かが役に立つと思われる場合に備えて、ここで共有するわずかに異なるルールのセットを使用しました。

OPと同様に、ユーザーID(uid)をリソースと共に保存します。ただし、新しいリソースを作成する場合、uidはまだありません。 ドキュメントの例 を使用すると、次のようなセキュリティルールになりました。

service cloud.firestore {
  match /databases/{database}/documents {
    match /messages/{document=**} {
      allow read, update, delete: if request.auth.uid == resource.data.uid;
      allow create: if request.auth.uid != null;
    }
  }
}
10
quicklikerabbit

データベースを、書き込みではなく読み取り専用で使用可能にすることができます。

  service cloud.firestore {
    match /databases/{database}/documents {
     match /{document=**} {
       allow read: if true;
       allow write: if false;
      }
   }
}
0
Ssubrat Rrudra