🎉

Cloud Firestoreでarray-containsを使ったときのセキュリティルールの書き方

2024/02/12に公開

初めまして。NuxtとFirebaseを使って、個人開発をしているキンジョウです!個人開発をしていて、array-containsを使って、ロジックを書いた時に、セキュリティルールはどうしたらいいのか??って、分からなかったので、記事にして、共有しておきます!

環境

"node": "20.11.0",
"npm": "10.4.0",
"firebase": "^10.7.1",

array-containsの説明

array-containsはフィールドの内の配列値に特定の文字列を含むドキュメントを全て返すQueryです。

より詳細はこちら

どんな時に必要になったのか?

ドキュメントのフィールドにinvites:[]というフィールドを持っていて、配列内に自分のuidが存在するドキュメントを全て返すというところのロジックを書いたときに、array-containsを使用しました。

index.vue
import { getDocs, query, where } from "firebase/firestore";

const q = query(tripListRef, where("invites","array-contains", uid));
const tripListDocs = await getDocs(q);

これだけでリストに自分が招待されているドキュメントを全て取得することができます。

解決方法

配列の中に一致するもののドキュメントを返すというセキュリティルールなんて、どうやって書けばいいの?と思いました。

結論はこうです。

firestore.rules
match /tripLists/{tripId}{
    allow write: if request.auth != null
    allow read: if request.auth.uid == resource.data.userId || request.auth.uid in resource.data.invites;
   }

気づけば簡単なのですが、resource.data.invitesでドキュメントのフィールドにアクセスできます。なので、request.auth.uid in resource.data.invitesだけで簡単に書けます!🎉

短い記事ですが、少しでも誰かの役に立てば幸いです!

Discussion