FirebaseのFirestoreのCollectionGroupはstores/{storeId}/items/{itemId}
のようにStoreCollection
を跨いだItemCollection
を一括で指定できる便利な機能です。
ただ、今回、セキュリティルールを設定している際に下記エラーに直面し、少し詰まったので対処方をまとめます。
FirebaseError: Missing or insufficient permissions
このエラーはセキュリティールールがfalse
を返しているときに吐かれるもので、もともと設定していた下記のセキュリティルールに問題があったことになります。
firestore.rules
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
match /stores/{storeId}/items/{itemId} {
// Itemのオーナーのみがを読み込みを可能
allow read: if resource.data.ownerId == request.auth.uid;
}
}
}
どうやらSubCollectionのフルパスではCollectionGroupで読み取る際のセキュリティルールとして引っかからないようです。そこで、下記のように対処しました。
firestore.rules
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
match /{path=**}/items/{itemId} {
allow read: if resource.data.ownerId == request.auth.uid;
}
}
}
CollectionGroupは使用上、ルートに別のItemsCollection
があればそれもグループとして扱うため、上記のようにItemsCollection
までのパスを再帰的に書いてあげる必要があるようです。