Ikuti semua informasi yang diumumkan di Firebase Summit, dan pelajari bagaimana Firebase dapat membantu Anda mempercepat pengembangan aplikasi dan menjalankan aplikasi dengan percaya diri. Pelajari Lebih Lanjut

Aturan Keamanan Dasar

Aturan Keamanan Firebase memungkinkan Anda mengontrol akses ke data yang disimpan. Sintaks aturan yang fleksibel berarti Anda dapat membuat aturan yang cocok dengan apa pun, dari semua penulisan ke seluruh database hingga operasi pada dokumen tertentu.

Panduan ini menjelaskan beberapa kasus penggunaan yang lebih mendasar yang mungkin ingin Anda terapkan saat menyiapkan aplikasi dan melindungi data Anda. Namun, sebelum Anda mulai menulis aturan, Anda mungkin ingin mempelajari lebih lanjut tentang bahasa penulisannya dan perilakunya .

Untuk mengakses dan memperbarui aturan Anda, ikuti langkah-langkah yang diuraikan dalam Mengelola dan menerapkan Aturan Keamanan Firebase .

Aturan default: Mode terkunci

Saat membuat database atau instance penyimpanan di konsol Firebase, Anda memilih apakah Aturan Keamanan Firebase membatasi akses ke data Anda ( mode Terkunci ) atau mengizinkan akses siapa saja ( mode Uji coba ). Di Cloud Firestore dan Realtime Database, aturan default untuk mode Terkunci menolak akses ke semua pengguna. Di Cloud Storage, hanya pengguna terautentikasi yang dapat mengakses keranjang penyimpanan.

Toko Api Awan

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Basis Data Waktu Nyata

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

Penyimpanan awan

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Aturan pembangunan-lingkungan

Saat mengerjakan aplikasi, Anda mungkin menginginkan akses yang relatif terbuka atau tidak terbatas ke data Anda. Pastikan untuk memperbarui Aturan Anda sebelum menerapkan aplikasi ke produksi. Juga ingat bahwa jika Anda menerapkan aplikasi Anda, itu dapat diakses publik — bahkan jika Anda belum meluncurkannya .

Ingatlah bahwa Firebase memungkinkan klien mengakses langsung data Anda, dan Aturan Keamanan Firebase adalah satu-satunya akses pemblokiran perlindungan untuk pengguna jahat. Mendefinisikan aturan secara terpisah dari logika produk memiliki sejumlah keuntungan: klien tidak bertanggung jawab untuk menegakkan keamanan, penerapan buggy tidak akan membahayakan data Anda, dan yang paling penting, Anda tidak mengandalkan server perantara untuk melindungi data dari dunia luar.

Semua pengguna yang diautentikasi

Meskipun kami tidak menyarankan membiarkan data Anda dapat diakses oleh pengguna mana pun yang masuk, mungkin berguna untuk mengatur akses ke pengguna yang diautentikasi saat Anda mengembangkan aplikasi.

Toko Api Awan

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Basis Data Waktu Nyata

{
  "rules": {
    ".read": "auth.uid !== null",
    ".write": "auth.uid !== null"
  }
}

Penyimpanan awan

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Aturan siap produksi

Saat Anda bersiap untuk menerapkan aplikasi, pastikan data Anda terlindungi dan akses tersebut diberikan dengan benar kepada pengguna Anda. Manfaatkan Otentikasi untuk menyiapkan akses berbasis pengguna dan membaca langsung dari database Anda untuk menyiapkan akses berbasis data.

Pertimbangkan untuk menulis aturan saat Anda menyusun data, karena cara Anda menyiapkan aturan memengaruhi cara Anda membatasi akses ke data di jalur yang berbeda.

Akses hanya pemilik konten

Aturan ini membatasi akses hanya ke pemilik konten yang diautentikasi. Data hanya dapat dibaca dan ditulis oleh satu pengguna, dan jalur data berisi ID pengguna.

Kapan aturan ini berfungsi: Aturan ini berfungsi dengan baik jika data dibungkam oleh pengguna — jika satu-satunya pengguna yang perlu mengakses data adalah pengguna yang sama yang membuat data.

Saat aturan ini tidak berfungsi: Kumpulan aturan ini tidak berfungsi saat banyak pengguna perlu menulis atau membaca data yang sama — pengguna akan menimpa data atau tidak dapat mengakses data yang mereka buat.

Untuk menyiapkan aturan ini: Buat aturan yang mengonfirmasi bahwa pengguna yang meminta akses untuk membaca atau menulis data adalah pengguna yang memiliki data tersebut.

Toko Api Awan

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{userId}/{documents=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId
    }
  }
}

Basis Data Waktu Nyata

{
  "rules": {
    "some_path": {
      "$uid": {
        // Allow only authenticated content owners access to their data
        ".read": "auth !== null && auth.uid === $uid",
        ".write": "auth !== null && auth.uid === $uid"
      }
    }
  }
}

Penyimpanan awan

// Grants a user access to a node matching their user ID
service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

Campuran akses publik dan pribadi

Aturan ini mengizinkan siapa saja untuk membaca kumpulan data, tetapi membatasi kemampuan untuk membuat atau mengubah data pada jalur tertentu hanya untuk pemilik konten yang diautentikasi.

Saat aturan ini berfungsi: Aturan ini berfungsi dengan baik untuk aplikasi yang memerlukan elemen yang dapat dibaca secara publik, tetapi perlu membatasi akses edit ke pemilik elemen tersebut. Misalnya, aplikasi obrolan atau blog.

Saat aturan ini tidak berfungsi: Seperti aturan khusus pemilik konten, kumpulan aturan ini tidak berfungsi saat banyak pengguna perlu mengedit data yang sama. Pengguna pada akhirnya akan menimpa data satu sama lain.

Untuk menyetel aturan ini: Buat aturan yang memungkinkan akses baca untuk semua pengguna (atau semua pengguna yang diautentikasi), dan konfirmasi bahwa data tulisan pengguna adalah pemiliknya.

Toko Api Awan

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow create: if request.auth.uid == request.resource.data.author_uid;
      allow update, delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}

Basis Data Waktu Nyata

{
// Allow anyone to read data, but only authenticated content owners can
// make changes to their data

  "rules": {
    "some_path": {
      "$uid": {
        ".read": true,
        // or ".read": "auth.uid !== null" for only authenticated users
        ".write": "auth.uid === $uid"
      }
    }
  }
}

Penyimpanan awan

service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read;
      allow write: if request.auth.uid == userId;
    }
  }
}

Akses berbasis atribut dan berbasis peran

Agar aturan ini berfungsi, Anda harus menentukan dan menetapkan atribut ke pengguna di data Anda. Aturan Keamanan Firebase memeriksa permintaan terhadap data dari database Anda atau metadata file untuk mengonfirmasi atau menolak akses.

Kapan aturan ini berfungsi: Jika Anda menetapkan peran kepada pengguna, aturan ini memudahkan untuk membatasi akses berdasarkan peran atau grup pengguna tertentu. Misalnya, jika Anda menyimpan nilai, Anda dapat menetapkan tingkat akses yang berbeda ke grup "siswa" (baca konten mereka saja), grup "guru" (baca dan tulis dalam mata pelajaran mereka), dan grup "kepala sekolah" (baca semua konten).

Jika aturan ini tidak berfungsi: Di ​​Realtime Database dan Cloud Storage, aturan Anda tidak dapat memanfaatkan metode get() yang dapat digabungkan oleh aturan Cloud Firestore. Akibatnya, Anda harus menyusun database atau metadata file untuk mencerminkan atribut yang Anda gunakan dalam aturan.

Untuk menyiapkan aturan ini: Di ​​Cloud Firestore, sertakan kolom dalam dokumen pengguna yang dapat Anda baca, lalu susun aturan Anda untuk membaca kolom tersebut dan berikan akses bersyarat. Di Realtime Database, buat jalur data yang menentukan pengguna aplikasi Anda dan beri mereka peran di node anak.

Anda juga dapat menyiapkan klaim khusus di Authentication lalu mengambil informasi tersebut dari variabel auth.token di Aturan Keamanan Firebase.

Atribut dan peran yang ditentukan data

Aturan ini hanya berfungsi di Cloud Firestore dan Realtime Database.

Toko Api Awan

Ingatlah bahwa setiap kali aturan Anda menyertakan pembacaan, seperti aturan di bawah, Anda akan dikenai biaya untuk operasi baca di Cloud Firestore.

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, Check a boolean `admin` attribute
    allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"
   }
  }
}

Basis Data Waktu Nyata

{
  "rules": {
    "some_path": {
      "${subpath}": {
        //
        ".write": "root.child('users').child(auth.uid).child('role').val() === 'admin'",
        ".read": true
      }
    }
  }
}

Atribut dan peran klaim khusus

Untuk menerapkan aturan ini, siapkan klaim khusus di Firebase Authentication, lalu manfaatkan klaim tersebut dalam aturan Anda.

Toko Api Awan

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, check for an admin claim
    allow write: if request.auth.token.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if request.auth.token.reader == "true";
     allow write: if request.auth.token.writer == "true";
   }
  }
}

Basis Data Waktu Nyata

{
  "rules": {
    "some_path": {
      "$uid": {
        // Create a custom claim for each role or group
        // you want to leverage
        ".write": "auth.uid !== null && auth.token.writer === true",
        ".read": "auth.uid !== null && auth.token.reader === true"
      }
    }
  }
}

Penyimpanan awan

service firebase.storage {
  // Allow reads if the group ID in your token matches the file metadata's `owner` property
  // Allow writes if the group ID is in the user's custom token
  match /files/{groupId}/{fileName} {
    allow read: if resource.metadata.owner == request.auth.token.groupId;
    allow write: if request.auth.token.groupId == groupId;
  }
}

Atribut penyewa

Untuk menerapkan aturan ini, siapkan multitenancy di Google Cloud Identity Platform (GCIP), lalu manfaatkan tenant dalam aturan Anda. Contoh berikut memungkinkan penulisan dari pengguna di penyewa tertentu misalnya tenant2-m6tyz

Toko Api Awan

service cloud.firestore {
  match /databases/{database}/documents {
    // For tenant-based access control, check for a tenantID
    allow write: if request.auth.token.firebase.tenant == 'tenant2-m6tyz';
    allow read: true;
  }
}

Basis Data Waktu Nyata

{
  "rules": {
    "some_path": {
      "$uid": {
        // Only allow reads and writes if user belongs to a specific tenant
        ".write": "auth.uid !== null && auth.token.firebase.tenant === 'tenant2-m6tyz'",
        ".read": "auth.uid !== null
      }
    }
  }
}

Penyimpanan awan

service firebase.storage {
  // Only allow reads and writes if user belongs to a specific tenant
  match /files/{tenantId}/{fileName} {
    allow read: if request.auth != null;
    allow write: if request.auth.token.firebase.tenant == tenantId;
  }
}