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

Pelajari sintaks inti dari Aturan Keamanan Firebase untuk bahasa Cloud Storage

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

Aturan Keamanan Firebase untuk Cloud Storage memungkinkan Anda mengontrol akses ke objek yang disimpan di bucket Cloud Storage. Sintaks aturan yang fleksibel memungkinkan Anda membuat aturan untuk mengontrol operasi apa pun, mulai dari semua penulisan ke bucket Cloud Storage hingga operasi pada file tertentu.

Panduan ini menjelaskan sintaks dasar dan struktur Aturan Keamanan Cloud Storage untuk membuat kumpulan aturan yang lengkap.

Deklarasi layanan dan basis data

Aturan Keamanan Firebase untuk Cloud Storage selalu dimulai dengan deklarasi berikut:

service firebase.storage {
    // ...
}

Deklarasi service firebase.storage aturan ke Cloud Storage, mencegah konflik antara Aturan Keamanan Cloud Storage dan aturan untuk produk lain seperti Cloud Firestore.

Aturan baca/tulis dasar

Aturan dasar terdiri dari pernyataan match yang mengidentifikasi bucket Cloud Storage, pernyataan kecocokan yang menentukan nama file, dan ekspresi allow yang memerinci saat membaca data yang ditentukan diizinkan. allow ekspresi menentukan metode akses (misalnya, membaca, menulis) yang terlibat, dan kondisi di mana akses diperbolehkan atau ditolak.

Dalam kumpulan aturan default Anda, pernyataan match pertama menggunakan ekspresi karakter pengganti {bucket} untuk menunjukkan bahwa aturan berlaku untuk semua keranjang di proyek Anda. Kami akan membahas ide pertandingan wildcard lebih lanjut di bagian selanjutnya.

service firebase.storage {
  // The {bucket} wildcard indicates we match files in all Cloud Storage buckets
  match /b/{bucket}/o {
    // Match filename
    match /filename {
      allow read: if <condition>;
      allow write: if <condition>;
    }
  }
}

Semua pernyataan kecocokan mengarah ke file. Pernyataan kecocokan dapat mengarah ke file tertentu, seperti pada match /images/profilePhoto.png .

Cocokkan wildcard

Selain menunjuk ke satu file, Aturan bisa menggunakan karakter pengganti untuk menunjuk ke file apa pun dengan awalan string tertentu dalam namanya, termasuk garis miring, seperti pada match /images/{imageId} .

Pada contoh di atas, pernyataan kecocokan menggunakan sintaks karakter pengganti {imageId} . Ini berarti aturan berlaku untuk file apa pun dengan /images/ di awal namanya, seperti /images/profilePhoto.png atau /images/croppedProfilePhoto.png . Saat ekspresi allow dalam pernyataan kecocokan dievaluasi, variabel imageId akan menyelesaikan ke nama file gambar, seperti profilePhoto.png atau croppedProfilePhoto.png .

Variabel wildcard dapat direferensikan dari dalam match untuk memberikan nama file atau otorisasi jalur:

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

Data hierarkis

Seperti yang kami katakan sebelumnya, tidak ada struktur hierarki di dalam keranjang Cloud Storage. Namun dengan menggunakan konvensi penamaan file, seringkali yang menyertakan garis miring pada nama file, kita dapat meniru struktur yang terlihat seperti rangkaian direktori dan subdirektori bersarang. Penting untuk memahami bagaimana Aturan Keamanan Firebase berinteraksi dengan nama file ini.

Pertimbangkan situasi sekumpulan file dengan nama yang semuanya dimulai dengan batang /images/ . Aturan Keamanan Firebase hanya berlaku pada nama file yang cocok, sehingga kontrol akses yang ditentukan pada batang /images/ tidak berlaku pada batang /mp3s/ . Sebagai gantinya, tulis aturan eksplisit yang cocok dengan pola nama file yang berbeda:

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      allow read, write: if <condition>;
    }

    // Explicitly define rules for the 'mp3s' pattern
    match /mp3s/{mp3Id} {
      allow read, write: if <condition>;
    }
  }
}

Saat pernyataan match bersarang, jalur pernyataan match dalam selalu ditambahkan ke jalur pernyataan match luar. Oleh karena itu, dua kumpulan aturan berikut setara:

service firebase.storage {
  match /b/{bucket}/o {
    match /images {
      // Exact match for "images/profilePhoto.png"
      match /profilePhoto.png {
        allow write: if <condition>;
      }
    }
  }
}
service firebase.storage {
  match /b/{bucket}/o {
    // Exact match for "images/profilePhoto.png"
    match /images/profilePhoto.png {
      allow write: if <condition>;
      }
  }
}

Wildcard pertandingan rekursif

Selain karakter pengganti yang mencocokkan dan mengembalikan string di akhir nama file, karakter pengganti beberapa segmen dapat dideklarasikan untuk pencocokan yang lebih kompleks dengan menambahkan =** ke nama karakter pengganti, seperti {path=**} :

// Partial match for files that start with "images"
match /images {

  // Exact match for "images/**"
  // e.g. images/users/user:12345/profilePhoto.png is matched
  // images/profilePhoto.png is also matched!
  match /{allImages=**} {
    // This rule matches one or more path segments (**)
    // allImages is a path that contains all segments matched
    allow read: if <other_condition>;
  }
}

Jika beberapa aturan cocok dengan file, hasilnya adalah OR dari hasil semua evaluasi aturan. Artinya, jika ada aturan yang cocok dengan file yang dievaluasi menjadi true , hasilnya adalah true .

Pada aturan di atas, file "images/profilePhoto.png" dapat dibaca jika salah satu condition atau other_condition bernilai true, sedangkan file "images/users/user:12345/profilePhoto.png" hanya tunduk pada hasil other_condition .

Aturan Keamanan Cloud Storage tidak menurun, dan aturan hanya dievaluasi saat jalur permintaan cocok dengan jalur dengan aturan yang ditentukan.

Versi 1

Aturan Keamanan Firebase menggunakan versi 1 secara default. Di versi 1, wildcard rekursif cocok dengan satu atau lebih elemen nama file, bukan elemen nol atau lebih. Jadi, match /images/{filenamePrefixWildcard}/{imageFilename=**} cocok dengan nama file seperti /images/profilePics/profile.png, tetapi bukan /images/badge.png. Gunakan /images/{imagePrefixorFilename=**} sebagai gantinya.

Wildcard rekursif harus muncul di akhir pernyataan pertandingan.

Kami menyarankan Anda menggunakan versi 2 untuk fitur-fiturnya yang lebih canggih.

Versi 2

Dalam Aturan Keamanan Firebase versi 2, karakter pengganti rekursif cocok dengan nol item jalur atau lebih. Jadi, /images/{filenamePrefixWildcard}/{imageFilename=**} cocok dengan nama file /images/profilePics/profile.png dan /images/badge.png.

Anda harus ikut serta ke versi 2 dengan menambahkan rules_version = '2'; di bagian atas aturan keamanan Anda:

rules_version = '2';
service cloud.storage {
  match /b/{bucket}/o {
   ...
 }
}

Anda dapat memiliki paling banyak satu wildcard rekursif per pernyataan kecocokan, tetapi dalam versi 2, Anda dapat menempatkan wildcard ini di mana saja dalam pernyataan kecocokan. Sebagai contoh:

rules_version = '2';
service firebase.storage {
 match /b/{bucket}/o {
   // Matches any file in a songs "subdirectory" under the
   // top level of your Cloud Storage bucket.
   match /{prefixSegment=**}/songs/{mp3filenames} {
     allow read, write: if <condition>;
   }
  }
}

Operasi granular

Dalam beberapa situasi, ada gunanya memecah read dan write menjadi operasi yang lebih terperinci. Misalnya, aplikasi Anda mungkin ingin menerapkan kondisi yang berbeda pada pembuatan file daripada pada penghapusan file.

Operasi read dapat dipecah menjadi get dan list .

Aturan write dapat dipecah menjadi create , update , dan delete :

service firebase.storage {
  match /b/{bucket}/o {
    // A read rule can be divided into read and list rules
    match /images/{imageId} {
      // Applies to single file read requests
      allow get: if <condition>;
      // Applies to list and listAll requests (Rules Version 2)
      allow list: if <condition>;

    // A write rule can be divided into create, update, and delete rules
    match /images/{imageId} {
      // Applies to writes to file contents
      allow create: if <condition>;

      // Applies to updates to (pre-existing) file metadata
      allow update: if <condition>;

      // Applies to delete operations
      allow delete: if <condition>;
    }
  }
 }
}

Pernyataan pertandingan yang tumpang tindih

Nama file mungkin cocok dengan lebih dari satu pernyataan yang match . Dalam kasus di mana beberapa ekspresi yang allow cocok dengan permintaan, akses diizinkan jika salah satu kondisinya true :

service firebase.storage {
  match b/{bucket}/o {
    // Matches file names directly inside of '/images/'.
    match /images/{imageId} {
      allow read, write: if false;
    }

    // Matches file names anywhere under `/images/`
    match /images/{imageId=**} {
      allow read, write: if true;
    }
  }
}

Pada contoh di atas, semua operasi baca dan tulis ke file yang namanya dimulai dengan /images/ diperbolehkan karena aturan kedua selalu true , meskipun aturan pertama false .

Aturan bukanlah filter

Setelah Anda mengamankan data dan mulai menjalankan operasi file, ingatlah bahwa aturan keamanan bukanlah filter. Anda tidak dapat melakukan operasi pada sekumpulan file yang cocok dengan pola nama file dan berharap Cloud Storage hanya mengakses file yang izin aksesnya dimiliki oleh klien saat ini.

Misalnya, ambil aturan keamanan berikut:

service firebase.storage {
  match /b/{bucket}/o {
    // Allow the client to read files with contentType 'image/png'
    match /aFileNamePrefix/{aFileName} {
      allow read: if resource.contentType == 'image/png';
    }
  }
}

Ditolak : Aturan ini menolak permintaan berikut karena kumpulan hasil dapat menyertakan file di mana contentType bukan image/png :

Web
filesRef = storage.ref().child("aFilenamePrefix");

filesRef.listAll()
    .then(function(result) {
      console.log("Success: ", result.items);
    })
});

Aturan dalam Aturan Keamanan Cloud Storage mengevaluasi setiap kueri terhadap hasil potensialnya dan menggagalkan permintaan jika dapat mengembalikan file yang tidak memiliki izin untuk dibaca oleh klien. Permintaan akses harus mengikuti batasan yang ditetapkan oleh aturan Anda.

Langkah selanjutnya

Anda dapat memperdalam pemahaman tentang Aturan Keamanan Firebase untuk Cloud Storage:

  • Pelajari konsep utama selanjutnya dari bahasa Aturan, kondisi dinamis , yang memungkinkan Aturan Anda memeriksa otorisasi pengguna, membandingkan data yang ada dan yang masuk, memvalidasi data yang masuk, dan banyak lagi.

  • Tinjau kasus penggunaan keamanan biasa dan definisi Aturan Keamanan Firebase yang mengatasinya .

Anda dapat mempelajari kasus penggunaan Aturan Keamanan Firebase khusus untuk Cloud Storage: