Buka konsol

Memahami Aturan Firebase Realtime Database

Aturan Firebase Realtime Database menentukan siapa yang memiliki akses baca dan tulis ke database Anda, bagaimana strukturisasi data dilakukan, dan indeks apa yang ada. Aturan ini berada di server Firebase dan diberlakukan secara otomatis sepanjang waktu. Setiap permintaan baca dan tulis hanya akan dijalankan jika aturan mengizinkannya. Secara default, aturan Anda tidak mengizinkan siapa pun mengakses database Anda. Hal ini dimaksudkan untuk melindungi database dari penyalahgunaan hingga Anda sempat menyesuaikan aturan atau menetapkan autentikasi.

Aturan Realtime Database memiliki sintaks yang menyerupai JavaScript dan tersedia dalam empat jenis:

Jenis Aturan
.read Menjelaskan apakah dan kapan data boleh dibaca oleh pengguna.
.write Menjelaskan apakah dan kapan data boleh ditulis.
.validate Menentukan tampilan nilai yang diformat dengan benar, apakah nilai memiliki atribut turunan, dan tipe data.
.indexOn Menetapkan turunan ke indeks untuk mendukung pengurutan dan pembuatan kueri.

Gambaran umum keamanan Realtime Database

Firebase Realtime Database menyediakan serangkaian fitur yang lengkap untuk mengelola keamanan aplikasi. Fitur tersebut memudahkan Anda dalam mengautentikasi pengguna, memberlakukan izin pengguna, dan memvalidasi input.

Aplikasi yang didukung Firebase menjalankan lebih banyak kode sisi klien daripada tumpukan teknologi lainnya. Karena itu, cara kami menyikapi keamanan mungkin sedikit berbeda dibandingkan dengan yang biasanya Anda jumpai.

Autentikasi

Langkah pertama yang umum dalam mengamankan aplikasi Anda adalah mengidentifikasi pengguna Anda. Proses ini disebut autentikasi. Anda dapat menggunakan Firebase Authentication untuk mengajak pengguna login ke aplikasi Anda. Firebase Authentication mencakup dukungan drop-in untuk metode autentikasi umum seperti Google dan Facebook, serta login email dan kata sandi, login anonim, dan lainnya.

Identitas pengguna adalah konsep keamanan penting. Setiap pengguna memiliki data yang berbeda dan terkadang mereka memiliki kemampuan berbeda pula. Misalnya, pada aplikasi chat, setiap pesan dikaitkan dengan pengguna yang membuatnya. Pengguna juga bisa menghapus pesannya sendiri, namun bukan pesan yang diposting pengguna lain.

Otorisasi

Mengidentifikasi pengguna hanyalah sebagian dari keamanan. Setelah mengetahui identitas pengguna, Anda memerlukan cara untuk mengontrol akses mereka ke data di database. Dengan Aturan Realtime Database, Anda dapat mengontrol akses untuk setiap pengguna. Misalnya, berikut adalah sekumpulan aturan keamanan yang mengizinkan siapa saja membaca lokasi /foo/, namun tidak mengizinkan siapa pun menulis ke sana:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

Aturan .read dan.write berjenjang, sehingga kumpulan aturan ini memberikan akses baca ke setiap data di lokasi /foo/ dan juga lokasi yang lebih dalam, seperti /foo/bar/baz. Harap diperhatikan bahwa aturan .read dan .write yang lebih dangkal pada database akan menggantikan aturan yang lebih dalam, sehingga pada contoh ini akses baca ke /foo/bar/baz akan tetap diberikan sekalipun aturan pada lokasi /foo/bar/baz disetel ke false.

Aturan Realtime Database mencakup variabel bawaan dan fungsi yang memungkinkan Anda merujuk ke lokasi lain, stempel waktu sisi server, informasi autentikasi, dan lainnya. Berikut adalah contoh aturan yang memberikan akses tulis ke /users/<uid>/ bagi pengguna terautentikasi, dengan <uid> berupa ID pengguna yang diperoleh melalui Firebase Authentication.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

Validasi data

Firebase Realtime Database tidak memiliki skema. Hal ini memudahkan Anda dalam mengubah data selama pengembangan aplikasi; namun, begitu aplikasi siap didistribusikan, data harus selalu konsisten. Bahasa aturan ini mencakup aturan .validate yang memungkinkan Anda menerapkan logika validasi menggunakan ekspresi yang sama seperti pada aturan .read dan .write. Satu-satunya perbedaan adalah aturan validasi tidak berjenjang, sehingga semua aturan validasi yang relevan harus disetel ke true agar penulisan diizinkan.

Aturan ini menetapkan bahwa data yang dituliskan ke /foo/ haruslah berupa string dengan panjang kurang dari 100 karakter:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

Aturan validasi memiliki akses ke semua fungsi dan variabel bawaan yang sama seperti aturan .read dan .write. Anda dapat menggunakan fungsi dan variabel bawaan ini untuk membuat aturan validasi yang mengetahui data di tempat lain dalam database, identitas pengguna Anda, waktu server, dan banyak lagi.

Menetapkan indeks database

Firebase Realtime Database memungkinkan pengurutan dan kueri data. Untuk data ukuran kecil, database mendukung kueri ad hoc, sehingga biasanya indeks tidak diperlukan selama pengembangan. Namun, sebelum meluncurkan aplikasi, sebaiknya tentukan indeks untuk setiap kueri yang Anda miliki untuk memastikan bahwa indeks terus berfungsi saat aplikasi Anda berkembang.

Indeks ditentukan menggunakan aturan .indexOn. Berikut adalah contoh deklarasi indeks yang akan mengindeks kolom tinggi dan panjang untuk sekumpulan dinosaurus:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Langkah berikutnya