Cloud Storage için Firebase Güvenlik Kuralları, Cloud Storage paketlerinde depolanan nesnelere erişimi kontrol etmenize olanak tanır. Esnek kural sözdizimi, Cloud Storage paketinize yapılan tüm yazma işlemlerinden belirli bir dosya üzerindeki işlemlere kadar her türlü işlemi kontrol etmek için kurallar oluşturmanıza olanak tanır.
Bu kılavuz, eksiksiz kural kümeleri oluşturmak için Cloud Storage Güvenlik Kurallarının temel sözdizimini ve yapısını açıklar.
Hizmet ve veritabanı bildirimi
Cloud Storage için Firebase Güvenlik Kuralları her zaman aşağıdaki bildirimle başlar:
service firebase.storage {
// ...
}
service firebase.storage
bildirimi, kuralları Cloud Storage kapsamına alarak Cloud Storage Güvenlik Kuralları ile Cloud Firestore gibi diğer ürünlerin kuralları arasındaki çakışmaları önler.
Temel okuma/yazma kuralları
Temel kurallar, Cloud Storage gruplarını tanımlayan bir match
ifadesinden, bir dosya adını belirten bir eşleşme ifadesinden ve belirtilen verilerin okunmasına izin verildiğinde ayrıntı veren bir allow
ifadesinden oluşur. allow
ifadeleri ilgili erişim yöntemlerini (örn. okuma, yazma) ve erişimin hangi koşullar altında izin verildiğini veya reddedildiğini belirtir.
Varsayılan kural kümenizde, ilk match
deyimi, kuralların projenizdeki tüm gruplara uygulandığını belirtmek için bir {bucket}
joker karakter ifadesi kullanır. Bir sonraki bölümde joker karakter eşleşmeleri fikrini daha ayrıntılı olarak tartışacağız.
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>;
}
}
}
Tüm eşleşme ifadeleri dosyalara işaret eder. Match deyimi, match /images/profilePhoto.png
olduğu gibi belirli bir dosyaya işaret edebilir.
Joker karakterleri eşleştir
Kurallar, tek bir dosyaya işaret etmenin yanı sıra, match /images/{imageId}
örneğinde olduğu gibi, adında eğik çizgiler de dahil olmak üzere, adında belirli bir dize öneki olan herhangi bir dosyaya işaret etmek için joker karakterler kullanabilir.
Yukarıdaki örnekte, match ifadesi {imageId}
joker karakter sözdizimini kullanır. Bu, kuralın /images/profilePhoto.png
veya /images/croppedProfilePhoto.png
gibi adının başında /images/
bulunan tüm dosyalara uygulanacağı anlamına gelir. Match deyimindeki allow
ifadeleri değerlendirildiğinde, imageId
değişkeni, profilePhoto.png
veya croppedProfilePhoto.png
gibi görüntü dosya adına çözümlenir.
Dosya adı veya yol yetkilendirmesi sağlamak için match
içinden bir joker karakter değişkenine başvurulabilir:
// Another way to restrict the name of a file
match /images/{imageId} {
allow read: if imageId == "profilePhoto.png";
}
hiyerarşik veri
Daha önce de söylediğimiz gibi, Cloud Storage kovası içinde hiyerarşik bir yapı yoktur. Ancak, genellikle dosya adlarında eğik çizgiler içeren bir dosya adlandırma kuralı kullanarak, iç içe geçmiş bir dizi dizin ve alt dizin gibi görünen bir yapıyı taklit edebiliriz. Firebase Güvenlik Kurallarının bu dosya adlarıyla nasıl etkileşime girdiğini anlamak önemlidir.
Hepsi /images/
gövdesiyle başlayan adlara sahip bir dizi dosyanın durumunu düşünün. Firebase Güvenlik Kuralları yalnızca eşleşen dosya adına uygulanır, bu nedenle /images/
gövdesinde tanımlanan erişim kontrolleri /mp3s/
gövdesi için geçerli değildir. Bunun yerine, farklı dosya adı kalıplarıyla eşleşen açık kurallar yazın:
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>;
}
}
}
match
deyimlerini iç içe yerleştirirken, iç match
deyiminin yolu her zaman dış match
deyiminin yoluna eklenir. Aşağıdaki iki kural seti bu nedenle eşdeğerdir:
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>;
}
}
}
Yinelenen maç joker karakterleri
Eşleşen ve bir dosya adının sonunda dizeler döndüren joker karakterlere ek olarak, daha karmaşık eşleştirme için çok parçalı bir joker karakter , {path=**}
gibi joker karakter adına =**
eklenerek bildirilebilir:
// 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>;
}
}
Birden çok kural bir dosyayla eşleşirse sonuç, tüm kural değerlendirmelerinin sonucunun OR
. Diğer bir deyişle, dosyanın eşleştiği herhangi bir kural true
olarak değerlendirilirse sonuç true
olur.
Yukarıdaki kurallarda, "images/profilePhoto.png" dosyası, condition
veya other_condition
biri doğru olarak değerlendirilirse okunabilirken, "images/users/user:12345/profilePhoto.png" dosyası yalnızca other_condition
sonucuna tabidir. .
Bulut Depolama Güvenlik Kuralları kademeli değildir ve kurallar yalnızca istek yolu, belirtilen kurallara sahip bir yolla eşleştiğinde değerlendirilir.
Versiyon 1
Firebase Güvenlik Kuralları, varsayılan olarak sürüm 1'i kullanır. Sürüm 1'de, yinelemeli joker karakterler, sıfır veya daha fazla öğeyle değil, bir veya daha fazla dosya adı öğesiyle eşleşir. Bu nedenle, match /images/{filenamePrefixWildcard}/{imageFilename=**}
/images/profilePics/profile.png gibi bir dosya adıyla eşleşir, ancak /images/badge.png ile eşleşmez. Bunun yerine /images/{imagePrefixorFilename=**}
kullanın.
Yinelemeli joker karakterler, bir eşleşme bildiriminin sonunda gelmelidir.
Daha güçlü özellikleri için sürüm 2'yi kullanmanızı öneririz.
Versiyon 2
Firebase Güvenlik Kuralları'nın 2. sürümünde, yinelemeli joker karakterler sıfır veya daha fazla yol öğesiyle eşleşir. Böylece, /images/{filenamePrefixWildcard}/{imageFilename=**}
/images/profilePics/profile.png ve /images/badge.png dosya adlarıyla eşleşir.
rules_version = '2';
ekleyerek sürüm 2'ye kaydolmalısınız. güvenlik kurallarınızın en üstünde:
rules_version = '2';
service cloud.storage {
match /b/{bucket}/o {
...
}
}
Eşleşme bildirimi başına en fazla bir yinelenen joker karakteriniz olabilir, ancak sürüm 2'de bu joker karakteri eşleşme ifadesinde herhangi bir yere yerleştirebilirsiniz. Örneğin:
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>;
}
}
}
Ayrıntılı işlemler
Bazı durumlarda, read
ve write
işlemlerini daha ayrıntılı işlemlere ayırmak yararlıdır. Örneğin, uygulamanız dosya oluşturmada dosya silmeye göre farklı koşullar uygulamak isteyebilir.
Bir read
işlemi get
ve list
olarak bölünebilir.
Bir write
kuralı, create
, update
ve delete
olarak bölünebilir:
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>; } } } }
Çakışan eşleşme ifadeleri
Bir dosya adının birden fazla match
ifadesiyle eşleşmesi mümkündür. Birden çok allow
ifadesinin bir istekle eşleşmesi durumunda, koşullardan herhangi biri true
erişime izin verilir:
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;
}
}
}
Yukarıdaki örnekte, adı /images/
ile başlayan dosyalara yapılan tüm okuma ve yazma işlemlerine izin verilir çünkü ikinci kural, ilk kural false
olsa bile her zaman true
olur.
Kurallar filtre değildir
Verilerinizi güvenceye aldıktan ve dosya işlemlerini gerçekleştirmeye başladığınızda, güvenlik kurallarının filtre olmadığını unutmayın. Bir dosya adı kalıbıyla eşleşen bir dizi dosya üzerinde işlem gerçekleştiremez ve Cloud Storage'ın yalnızca geçerli istemcinin erişim iznine sahip olduğu dosyalara erişmesini bekleyemezsiniz.
Örneğin, aşağıdaki güvenlik kuralını ele alalım:
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';
}
}
}
Reddedildi : Sonuç kümesi, contentType
image/png
olmadığı dosyaları içerebileceğinden, bu kural aşağıdaki isteği reddeder:
ağ
filesRef = storage.ref().child("aFilenamePrefix"); filesRef.listAll() .then(function(result) { console.log("Success: ", result.items); }) });
Cloud Storage Güvenlik Kuralları'ndaki Kurallar, her sorguyu potansiyel sonucuna göre değerlendirir ve istemcinin okuma iznine sahip olmadığı bir dosyayı döndürme olasılığı varsa isteği başarısız kılar. Erişim istekleri, kurallarınız tarafından belirlenen kısıtlamalara uymalıdır.
Sonraki adımlar
Cloud Storage için Firebase Güvenlik Kuralları konusundaki anlayışınızı derinleştirebilirsiniz:
Kural dilinin bir sonraki ana kavramını, Kurallarınızın kullanıcı yetkilendirmesini kontrol etmesine, mevcut ve gelen verileri karşılaştırmasına, gelen verileri doğrulamasına ve daha fazlasına olanak tanıyan dinamik koşulları öğrenin.
Tipik güvenlik kullanım durumlarını ve bunları ele alan Firebase Güvenlik Kuralları tanımlarını inceleyin.
Cloud Storage'a özgü Firebase Güvenlik Kuralları kullanım durumlarını inceleyebilirsiniz: