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

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Aturan Keamanan Firebase memungkinkan Anda mengontrol akses ke data tersimpan Anda. 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 mengamankan data Anda. Namun, sebelum Anda mulai menulis aturan, Anda mungkin ingin mempelajari lebih lanjut tentang bahasa penulisan aturan 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 Firebase console, Anda memilih apakah Aturan Keamanan Firebase membatasi akses ke data Anda ( Mode Terkunci ) atau mengizinkan siapa pun mengakses ( Mode Uji ). 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 bucket penyimpanan.

Cloud Firestore

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 pengembangan-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. Ingat juga bahwa jika Anda menerapkan aplikasi Anda, itu dapat diakses secara publik — bahkan jika Anda belum meluncurkannya .

Ingat bahwa Firebase mengizinkan klien akses langsung ke data Anda, dan Aturan Keamanan Firebase adalah satu-satunya akses pemblokiran pengaman untuk pengguna jahat. Mendefinisikan aturan secara terpisah dari logika produk memiliki sejumlah keuntungan: klien tidak bertanggung jawab untuk menegakkan keamanan, implementasi buggy tidak akan membahayakan data Anda, dan yang terpenting, Anda tidak mengandalkan server perantara untuk melindungi data dari dunia.

Semua pengguna yang diautentikasi

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

Cloud Firestore

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 men-deploy aplikasi Anda, 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 pemilik konten saja

Aturan ini membatasi akses ke pemilik konten yang diautentikasi saja. 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: Aturan ini tidak berfungsi saat beberapa pengguna perlu menulis atau membaca data yang sama — pengguna akan menimpa data atau tidak dapat mengakses data yang telah 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.

Cloud Firestore

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;
    }
  }
}

Akses publik dan pribadi campuran

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.

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

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

Untuk menyiapkan aturan ini: Buat aturan yang memungkinkan akses baca untuk semua pengguna (atau semua pengguna yang diautentikasi), dan konfirmasikan bahwa data yang ditulis pengguna adalah pemiliknya.

Cloud Firestore

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 atau metadata file Anda untuk mengonfirmasi atau menolak akses.

Saat 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" (hanya membaca konten mereka), grup "guru" (membaca dan menulis dalam mata pelajaran mereka), dan grup "kepala sekolah" (membaca semua konten).

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

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 secara kondisional. Di Realtime Database, buat jalur data yang mendefinisikan pengguna aplikasi Anda dan memberi mereka peran dalam node turunan.

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

Atribut dan peran yang ditentukan data

Aturan ini hanya berfungsi di Cloud Firestore dan Realtime Database.

Cloud Firestore

Ingat bahwa setiap kali aturan Anda menyertakan pembacaan, seperti aturan di bawah, Anda akan ditagih 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 di aturan Anda.

Cloud Firestore

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

Cloud Firestore

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;
  }
}