Cloud Storage for Firebase menyediakan model keamanan deklaratif berbasis jalur yang disebut Firebase Security Rules untuk Cloud Storage, yang bisa Anda gunakan untuk mengamankan file dengan cepat dan mudah.
Memahami Aturan
Firebase Security Rules untuk Cloud Storage digunakan untuk menentukan siapa saja yang memiliki akses baca dan tulis ke file yang disimpan di Cloud Storage, serta bagaimana file disusun dan metadata apa yang dikandungnya. Jenis aturan dasarnya adalah aturan allow
, yang memungkinkan permintaan read
dan write
jika kondisi yang ditentukan secara opsional ditetapkan, misalnya:
// If no condition is specified, the rule evaluates to true allow read; // Rules can optionally specify a condition allow write: if <condition>; // Rules can also specify multiple request methods allow read, write: if <condition>;
Mencocokkan Jalur
Cloud Storage Security Rules match
dengan jalur file yang digunakan untuk mengakses file di Cloud Storage. Aturan dapat match
dengan jalur persisnya atau jalur karakter pengganti, dan aturan juga dapat dijadikan bertingkat. Jika tidak ada aturan match yang mengizinkan metode permintaan, atau jika kondisi bernilai false
, permintaan akan ditolak.
Kecocokan Persis
// Exact match for "images/profilePhoto.png" match /images/profilePhoto.png { allow write: if <condition>; } // Exact match for "images/croppedProfilePhoto.png" match /images/croppedProfilePhoto.png { allow write: if <other_condition>; }
Kecocokan Bertingkat
// Partial match for files that start with "images" match /images { // Exact match for "images/profilePhoto.png" match /profilePhoto.png { allow write: if <condition>; } // Exact match for "images/croppedProfilePhoto.png" match /croppedProfilePhoto.png { allow write: if <other_condition>; } }
Kecocokan Karakter Pengganti
Aturan juga dapat digunakan untuk match
pola menggunakan karakter pengganti. Karakter pengganti adalah
variabel bernama yang mewakili string tunggal, seperti
profilePhoto.png
, atau beberapa segmen jalur, seperti
images/profilePhoto.png
.
Karakter pengganti dibuat dengan menambahkan tanda kurung kurawal di awal dan akhir nama karakter pengganti,
misalnya {string}
. Karakter pengganti beberapa segmen dapat dideklarasikan 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/profilePhoto.png is matched match /{imageId} { // This rule only matches a single path segment (*) // imageId is a string that contains the specific segment matched allow read: if <condition>; } // 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 sebuah file,
hasilnya adalah OR
dari hasil semua evaluasi aturan. Artinya, jika aturan yang cocok dengan file bernilai true
,
hasilnya adalah true
.
Pada aturan di atas, file "images/profilePhoto.png" dapat dibaca jika salah satu dari
condition
atau other_condition
bernilai benar, sedangkan file
"images/users/user:12345/profilePhoto.png" hanya bergantung pada hasil
other_condition
.
Variabel karakter pengganti dapat dirujuk dari dalam match
yang memberikan
nama file atau otorisasi jalur:
// Another way to restrict the name of a file match /images/{imageId} { allow read: if imageId == "profilePhoto.png"; }
Cloud Storage Security Rules tidak menurun, dan aturan hanya dievaluasi jika jalur permintaan cocok dengan jalur dengan aturan yang ditentukan.
Evaluasi Permintaan
Upload, download, perubahan metadata, dan penghapusan dievaluasi menggunakan request
dikirim ke Cloud Storage. Variabel request
berisi jalur file tempat permintaan dijalankan, waktu permintaan diterima, dan nilai resource
baru jika permintaan tersebut adalah permintaan tulis. Header HTTP dan status autentikasi juga dicantumkan.
Objek request
juga berisi ID unik pengguna dan payload Firebase Authentication di objek request.auth
yang akan dijelaskan lebih lanjut di bagian Keamanan Berbasis Pengguna dalam dokumentasi.
Daftar lengkap properti di objek request
tersedia di bawah:
Properti | Jenis | Deskripsi |
---|---|---|
auth |
map<string, string> | Saat pengguna login, memberikan uid , ID unik pengguna, dan token , peta klaim JWT Firebase Authentication. Jika pengguna tidak login, nilainya adalah null . |
params |
map<string, string> | Peta yang memuat parameter kueri permintaan. |
path |
jalur | path yang mewakili jalur tempat permintaan
dijalankan. |
resource |
map<string, string> | Nilai resource baru, hanya ada pada permintaan write .
|
time |
timestamp | Stempel waktu yang menunjukkan waktu server ketika permintaan dievaluasi. |
Evaluasi Resource
Saat mengevaluasi aturan, Anda mungkin juga ingin mengevaluasi metadata dari file yang diupload, didownload, diubah, atau dihapus. Dengan begitu, Anda dapat membuat aturan yang rumit dan kuat untuk melakukan hal spesifik, seperti hanya mengizinkan upload file dengan jenis konten tertentu atau penghapusan file dengan ukuran lebih besar dari ukuran tertentu.
Firebase Security Rules untuk Cloud Storage memberikan metadata file di objek resource
, yang berisi key-value pair dari metadata yang muncul pada objek Cloud Storage. Properti ini dapat diinspeksi pada permintaan read
atau write
untuk memastikan integritas data.
Pada permintaan write
(seperti upload, pembaruan metadata, dan penghapusan),
selain objek resource
, yang berisi metadata file untuk file
yang saat ini ada di jalur permintaan, Anda juga dapat menggunakan objek
request.resource
, yang berisi subset metadata file yang
akan ditulis jika operasi tulis diizinkan. Anda dapat menggunakan kedua nilai tersebut untuk
memastikan integritas data atau memberlakukan pembatasan aplikasi, seperti jenis atau ukuran file.
Daftar lengkap properti di objek resource
tersedia di bawah:
Properti | Jenis | Deskripsi |
---|---|---|
name |
string | Nama lengkap objek |
bucket |
string | Nama bucket yang ditempati objek ini. |
generation |
int | GCS object generation untuk objek ini. |
metageneration |
int | GCS object metageneration untuk objek ini. |
size |
int | Ukuran objek, dalam byte. |
timeCreated |
timestamp | Stempel waktu yang menunjukkan kapan objek dibuat. |
updated |
timestamp | Stempel waktu yang menunjukkan kapan objek terakhir diperbarui. |
md5Hash |
string | Hash MD5 untuk objek ini. |
crc32c |
string | Hash crc32c untuk objek ini. |
etag |
string | Etag yang terkait dengan objek ini. |
contentDisposition |
string | Disposisi konten yang terkait dengan objek ini. |
contentEncoding |
string | Encoding konten yang terkait dengan objek ini. |
contentLanguage |
string | Bahasa konten yang terkait dengan objek ini. |
contentType |
string | Jenis konten yang terkait dengan objek ini. |
metadata |
map<string, string> | Key-value pair untuk metadata kustom tambahan yang ditetapkan developer. |
request.resource
berisi semua properti di atas, kecuali generation
, metageneration
, etag
, timeCreated
, dan updated
.
Contoh Lengkap
Dengan menggabungkan semuanya, Anda dapat membuat contoh lengkap aturan untuk solusi penyimpanan gambar:
service firebase.storage { match /b/{bucket}/o { match /images { // Cascade read to any image type at any path match /{allImages=**} { allow read; } // Allow write files to the path "images/*", subject to the constraints: // 1) File is less than 5MB // 2) Content type is an image // 3) Uploaded content type matches existing content type (if it exists) // 4) File name (stored in imageId wildcard variable) is less than 32 characters match /{imageId} { allow write: if request.resource.size < 5 * 1024 * 1024 && request.resource.contentType.matches('image/.*') && (resource == null || request.resource.contentType == resource.contentType) && imageId.size() < 32 } } } }
Sekarang, mari integrasikan Firebase Authentication untuk akses file terperinci per pengguna di bagian Keamanan Pengguna.