Saya memiliki koleksi fireStore sederhana bernama jokes di mana ada dokumen per lelucon. Dalam lelucon, ada kunci published: boolean

Jadi idenya adalah memiliki satu koleksi dengan lelucon, tetapi setiap dokumen dapat diterbitkan atau tidak diterbitkan. Saya tidak ingin pengguna melihat lelucon yang tidak dipublikasikan.

Dalam aturan fireStore saya, saya memiliki yang berikut:

match /jokes/{id} {
  allow read: if get(/databases/$(database)/documents/jokes/$(id)).data.published == true
}

Dalam aplikasi saya, saya ingin pengguna hanya dapat melihat lelucon yang diterbitkan, oleh karena itu saya menggunakan di mana

this.$fireStore.collection('jokes').where('published', '==', true).get()

Ketika saya melakukan ini, konsol memberi tahu saya bahwa saya mendapat izin yang tidak mencukupi.

Apakah mungkin menggunakan pola ini, atau apakah saya harus menggunakan fungsi cloud untuk menyajikan lelucon yang dipublikasikan? Atau mungkin koleksi terpisah untuk yang tidak dipublikasikan?

0
Sølve Tornøe 1 Juli 2020, 16:15

1 menjawab

Jawaban Terbaik

Anda tidak memerlukan get() dalam aturan untuk ini, karena dokumen saat ini sudah tersedia sebagai resource. Faktanya, get() adalah masalahnya di sini, karena mesin aturan tidak dapat mengevaluasinya secara statis untuk semua dokumen sekaligus.

match /jokes/{id} {
  allow read: if resource.data.published == true
}

Lihat juga dokumentasi tentang meminta data dengan aman, khususnya bagian di < a href="https://firebase.google.com/docs/firestore/security/rules-query#secure_and_query_documents_based_on_a_field" rel="nofollow noreferrer">mengamankan dan menanyakan dokumen berdasarkan bidang

1
Frank van Puffelen 1 Juli 2020, 13:30