Catch up on everthing we announced at this year's Firebase Summit. Learn more

Pelajari sintaks inti dari Aturan Keamanan Firebase untuk bahasa Cloud Storage

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 database

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

service firebase.storage {
    // ...
}

The service firebase.storage deklarasi scopes aturan untuk Cloud Storage, mencegah konflik antara Cloud Aturan dan aturan Keamanan Penyimpanan untuk produk lainnya seperti Cloud Firestore.

Aturan baca/tulis dasar

Aturan dasar terdiri dari match pernyataan mengidentifikasi ember Cloud Storage, sebuah pernyataan pertandingan menentukan nama file, dan allow ekspresi merinci ketika membaca data tertentu diperbolehkan. allow ekspresi menentukan metode akses (misalnya, membaca, menulis) yang terlibat, dan kondisi di mana akses baik diperbolehkan atau ditolak.

Dalam ruleset default Anda, pertama match pernyataan menggunakan {bucket} wildcard ekspresi untuk menunjukkan aturan berlaku untuk semua ember dalam proyek Anda. Kami akan membahas ide pertandingan wildcard lebih lanjut di bagian berikutnya.

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 menunjuk ke file. Sebuah pernyataan pertandingan dapat menunjuk ke sebuah file tertentu, seperti dalam match /images/profilePhoto.png .

Cocokkan wildcard

Dalam additiont untuk menunjuk ke sebuah file tunggal, Aturan dapat menggunakan wildcard untuk menunjuk ke file dengan awalan string yang diberikan dalam namanya, termasuk garis miring, seperti dalam match /images/{imageId} .

Dalam contoh di atas, pernyataan pertandingan menggunakan {imageId} sintaks wildcard. Ini berarti aturan berlaku untuk file dengan /images/ pada awal namanya, seperti /images/profilePhoto.png atau /images/croppedProfilePhoto.png . Ketika allow ekspresi dalam laporan pertandingan dievaluasi, yang imageId variabel akan menyelesaikan ke nama file gambar, seperti profilePhoto.png atau croppedProfilePhoto.png .

Sebuah variabel wildcard dapat dirujuk dari dalam match untuk memberikan nama file atau otorisasi path:

// 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 hierarkis di dalam bucket Cloud Storage. Tetapi dengan menggunakan konvensi penamaan file, sering kali yang menyertakan garis miring dalam nama file, kita dapat meniru struktur yang terlihat seperti serangkaian direktori dan sub-direktori bersarang. Penting untuk memahami bagaimana Aturan Keamanan Firebase berinteraksi dengan nama file ini.

Mempertimbangkan situasi dari satu set file dengan nama yang semuanya dimulai dengan /images/ batang. Firebase Aturan Keamanan berlaku hanya pada nama file yang cocok, sehingga kontrol akses yang ditetapkan pada /images/ batang tidak berlaku untuk /mp3s/ batang. 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>;
    }
  }
}

Ketika bersarang match pernyataan, jalan batin match pernyataan selalu ditambahkan ke jalur luar match pernyataan. Oleh karena itu, dua aturan berikut ini 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 wildcard bahwa pertandingan dan kembali string pada akhir nama file, wildcard segmen beberapa dapat dideklarasikan untuk pencocokan yang lebih kompleks dengan menambahkan =** untuk nama wildcard, 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 sesuai file, hasilnya adalah OR dari hasil semua evaluasi aturan. Artinya, jika ada aturan file sesuai evalutes untuk true , hasilnya adalah true .

Dalam peraturan di atas, file "images / profilePhoto.png" dapat dibaca jika salah condition atau other_condition mengevaluasi benar, sedangkan file "images / pengguna / user: 12345 / profilePhoto.png" hanya tunduk pada hasil other_condition .

Aturan Keamanan Cloud Storage tidak mengalir, 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 nol atau lebih elemen. Dengan demikian, match /images/{filenamePrefixWildcard}/{imageFilename=**} cocok dengan nama file seperti /images/profilePics/profile.png, tapi tidak /images/badge.png. Gunakan /images/{imagePrefixorFilename=**} sebagai gantinya.

Wildcard rekursif harus ada di akhir pernyataan kecocokan.

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

Versi 2

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

Anda harus memilih-in 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 karakter pengganti rekursif per pernyataan kecocokan, tetapi dalam versi 2, Anda dapat menempatkan karakter pengganti 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, ini berguna untuk memecah read dan write ke dalam operasi yang lebih rinci. Misalnya, aplikasi Anda mungkin ingin menerapkan kondisi yang berbeda pada pembuatan file daripada pada penghapusan file.

Sebuah read operasi dapat dipecah menjadi get dan list .

Sebuah write aturan 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 document 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 nonexistent files
      allow create: if <condition>;

      // Applies to updates to file metadata
      allow update: if <condition>;

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

Pernyataan pertandingan yang tumpang tindih

Itu mungkin bagi nama file untuk mencocokkan lebih dari satu match pernyataan. Dalam kasus di mana beberapa allow ekspresi sesuai permintaan, akses diperbolehkan jika salah satu kondisi adalah true :

service firebase.storage {
  match b/{bucket}/o {
    // Matches any filename containing string '/images/'.
    match /images/{imageId} {
      allow read, write: if false;
    }

    // Matches all filenames containing string `/images/`
    match /images/{imageId=**} {
      allow read, write: if true;
    }
  }
}

Dalam contoh di atas, semua membaca dan menulis ke file dengan string /images/ di mana saja di nama file mereka akan diizinkan karena aturan kedua adalah selalu true , meskipun aturan pertama selalu false .

Aturan bukan filter

Setelah Anda mengamankan data dan mulai melakukan operasi file, ingatlah bahwa aturan keamanan bukanlah filter. Anda tidak dapat melakukan operasi pada sekumpulan file yang cocok dengan pola nama file dan mengharapkan Cloud Storage hanya mengakses file yang izinnya dapat diakses 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 hasil yang ditetapkan dapat menyertakan file mana contentType tidak image/png :

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

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

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

Langkah selanjutnya

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

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

  • Tinjau kasus penggunaan keamanan khas dan definisi Firebase Aturan Keamanan alamat mereka .

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