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 grubunuza yapılan tüm yazma işlemlerinden belirli bir dosyadaki işlemlere kadar her türlü işlemi kontrol etmek için kurallar oluşturmanıza olanak tanır.
Bu kılavuzda, eksiksiz kural kümeleri oluşturmak için Bulut Depolama Güvenlik Kurallarının temel sözdizimi ve yapısı açıklanmaktadır.
Hizmet ve veritabanı bildirimi
Bulut Depolama için Firebase Güvenlik Kuralları her zaman aşağıdaki bildirimle başlar:
service firebase.storage {
// ...
}
service firebase.storage
beyanı, kuralların kapsamını Cloud Storage'a kadar genişleterek Cloud Storage Güvenlik Kuralları ile Cloud Firestore gibi diğer ürünlere ilişkin kurallar arasındaki çakışmaları önler.
Temel okuma/yazma kuralları
Temel kurallar, Cloud Storage paketlerini tanımlayan bir match
ifadesinden, dosya adını belirten bir eşleşme ifadesinden ve belirtilen verilerin okunmasına ne zaman izin verildiğini ayrıntılandıran bir allow
ifadesinden oluşur. allow
ifadeleri, ilgili erişim yöntemlerini (örneğin, okuma, yazma) ve erişime izin verilen veya erişimin reddedildiği koşulları belirtir.
Varsayılan kural kümenizde, ilk match
ifadesi, 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 ifadesi, match /images/profilePhoto.png
örneğinde olduğu gibi belirli bir dosyaya işaret edebilir.
Joker karakterleri eşleştir
Kurallar, tek bir dosyayı işaret etmenin yanı sıra, match /images/{imageId}
örneğinde olduğu gibi, eğik çizgiler de dahil olmak üzere adında belirli bir dize öneki bulunan herhangi bir dosyayı 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 ifadesindeki allow
ifadeler 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 veriler
Daha önce de söylediğimiz gibi Cloud Storage paketinin içinde hiyerarşik bir yapı yoktur. Ancak, genellikle dosya adlarında eğik çizgi 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/
köküyle başlayan adlara sahip bir dizi dosyanın durumunu düşünün. Firebase Güvenlik Kuralları yalnızca eşleşen dosya adında geçerlidir, dolayısıyla /images/
kökünde tanımlanan erişim kontrolleri /mp3s/
kökü 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
ifadelerini iç içe yerleştirirken, içteki match
ifadesinin yolu her zaman dıştaki match
ifadesinin yoluna eklenir. Bu nedenle aşağıdaki iki kural seti 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 eşleşme joker karakterleri
Bir dosya adının sonundaki dizelerle eşleşen ve dönen joker karakterlere ek olarak, daha karmaşık eşleştirme için, joker karakter adına =**
eklenerek, {path=**}
gibi , birden çok bölümlü bir joker karakter 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>;
}
}
Bir dosyayla birden çok kural eşleşirse sonuç, tüm kural değerlendirmelerinin sonucunun OR
. Yani, 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
doğru olarak değerlendirilirse okunabilir; "images/users/user:12345/profilePhoto.png" dosyası ise yalnızca other_condition
sonucuna tabidir. .
Bulut Depolama Güvenlik Kuralları basamaklanmaz 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 özyinelemeli 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.
Tekrarlanan joker karakterler maç 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, özyinelemeli 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 dahil olmanız gerekir. güvenlik kurallarınızın en üstünde:
rules_version = '2';
service cloud.storage {
match /b/{bucket}/o {
...
}
}
Eşleşme ifadesi başına en fazla bir özyinelemeli joker karaktere sahip olabilirsiniz, ancak sürüm 2'de bu joker karakteri, match ifadesinin herhangi bir yerine 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>;
}
}
}
Granüler işlemler
Bazı durumlarda read
ve write
işlemlerini daha ayrıntılı işlemlere ayırmak yararlı olabilir. Örneğin, uygulamanız dosya oluşturmada dosya silmeye göre farklı koşullar uygulamak isteyebilir.
read
işlemi get
ve list
olarak ikiye ayrılabilir.
Bir write
kuralı, create
, update
ve delete
olarak ayrılabilir:
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 fazla allow
ifadesinin bir istekle eşleşmesi durumunda, koşullardan herhangi birinin true
olması durumunda 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, ilk kural false
olsa bile ikinci kural her zaman true
olduğundan, adı /images/
ile başlayan dosyalara yapılan tüm okuma ve yazma işlemlerine izin verilir.
Kurallar filtre değildir
Verilerinizi güven altına alıp dosya işlemlerini gerçekleştirmeye başladığınızda güvenlik kurallarının filtre olmadığını unutmayın. Bir dosya adı düzeniyle eşleşen bir dizi dosya üzerinde işlem gerçekleştiremez ve Cloud Storage'ın yalnızca mevcut istemcinin erişim iznine sahip olduğu dosyalara erişmesini bekleyemezsiniz.
Örneğin aşağıdaki güvenlik kuralını alın:
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 : Bu kural aşağıdaki isteği reddeder çünkü sonuç kümesi contentType
image/png
olmadığı dosyaları içerebilir:
ağ
filesRef = storage.ref().child("aFilenamePrefix"); filesRef.listAll() .then(function(result) { console.log("Success: ", result.items); }) });
Bulut Depolama Güvenlik Kurallarındaki Kurallar, her sorguyu olası sonucuna göre değerlendirir ve istemcinin okuma iznine sahip olmadığı bir dosyayı döndürebilirse istek başarısız olur. Erişim istekleri, kurallarınızın belirlediği kısıtlamalara uymalıdır.
Sonraki adımlar
Bulut Depolama için Firebase Güvenlik Kuralları hakkındaki anlayışınızı derinleştirebilirsiniz:
Kurallarınızın kullanıcı yetkilerini kontrol etmesine, mevcut ve gelen verileri karşılaştırmasına, gelen verileri doğrulamasına ve daha fazlasına olanak tanıyan Kural dilinin bir sonraki ana konsepti olan dinamik koşulları öğrenin.
Tipik güvenlik kullanım örneklerini ve bunlara yönelik Firebase Güvenlik Kuralları tanımlarını inceleyin.
Cloud Storage'a özel Firebase Güvenlik Kuralları kullanım örneklerini inceleyebilirsiniz: