Aturan Keamanan untuk operasi Pipeline

Tujuan utama dukungan aturan kueri Pipeline adalah untuk menciptakan kesesuaian dengan kemampuan pemfilteran mesin Aturan yang ada. Meskipun kueri Pipeline menawarkan serangkaian fitur yang lengkap, mesin Aturannya dibatasi untuk mengenali filter sederhana guna memastikan pemenuhan dan keamanan kueri.

Ekspresi Filter yang Didukung

Agar kueri dibatasi oleh aturan Anda, kueri tersebut harus menggunakan operator perbandingan standar terhadap konstanta. Jenis filter berikut dikenali oleh mesin Aturan:

  • Persamaan dan Pertidaksamaan: eq, neq.
  • Perbandingan: gt, gte, lt, lte.
  • Himpunan: in, arrayContains.

Berikut beberapa contohnya:

  • where(eq("foo", 2))
  • where(lt("foo", 2))
  • documents("/user/1", "/user/2").where(...)

Properti Permintaan

Anda dapat terus menggunakan objek request untuk memvalidasi autentikasi dan konteks kueri, meskipun beberapa properti yang tersedia dalam kueri standar tidak didukung dalam pipeline.

Properti yang didukung

Mesin baru ini tetap mendukung properti berikut:

  • request.auth: Mengakses data token dan UID pengguna.
  • request.method: Mengidentifikasi operasi (Misalnya, get, list).
  • request.path: Jalur resource yang diakses.
  • request.time: Stempel waktu sisi server dari permintaan.

Properti yang tidak didukung

Properti request.query seperti limit, offset, dan orderBy tidak didukung untuk pemeriksaan aturan Pipeline karena kompleksitas penentuan nilai ini dalam kueri yang terdiri dari beberapa tahap.

Penanganan dan izin tahap pipeline

Ada berbagai tahap pipeline yang dipetakan ke operasi terperinci tertentu dalam aturan keamanan:

  • Izin allow list: Dipicu oleh tahap collection(), collectionGroup(), dan database().
  • Izin allow get: Dipicu oleh tahap documents(), yang diperlakukan serupa dengan operasi get batch.
  • Tahap modifikasi kolom: Aturan hanya berlaku pada data yang disimpan, bukan nilai turunan. Jika pipeline mencakup tahap yang mengubah kolom (Misalnya, AddFields, ReplaceWith, Select), mesin Aturan akan berhenti menerapkan batasan filter setelah mencapai tahap tersebut.
  • Tahap literals: Tahap literals() tidak melakukan pembacaan dari database, tetapi dapat menimbulkan biaya. Untuk mencegah penyalahgunaan, tahap ini harus dipasangkan dengan tahap lain (seperti collection()) yang dapat diverifikasi oleh aturan.