Cloud Storage için Firebase Güvenlik Kuralları, Cloud Storage paketlerinde depolanan nesnelere erişimi kontrol etmenize olanak tanır. Esnek kurallar söz dizimi, Bulut Depolama grubunuzdaki tüm yazma işlemlerinden belirli bir dosyadaki işlemlere kadar herhangi bir işlemi kontrol etmek için kurallar oluşturmanıza olanak tanır.
Bu kılavuz, eksiksiz kural kümeleri oluşturmak için Bulut Depolama Güvenlik Kurallarının temel sözdizimini ve yapısını açıklar.
Hizmet ve veritabanı beyanı
Cloud Storage için Firebase Güvenlik Kuralları her zaman aşağıdaki bildirimle başlar:
service firebase.storage {
// ...
}
service firebase.storage
bildirimi, kuralların kapsamını Cloud Storage'a vererek, 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 paketlerini 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 (örneğin, okuma, yazma) ve erişime izin verilen veya reddedilen koşulları belirtir.
Varsayılan kural kümenizde, ilk match
ifadesi, projenizdeki tüm paketler için geçerli olan kuralları belirtmek için bir {bucket}
joker ifadesi kullanır. Bir sonraki bölümde joker karakter eşleşmeleri fikrini daha fazla 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. Bir eşleşme ifadesi, match /images/profilePhoto.png
olduğu gibi belirli bir dosyaya işaret edebilir.
Maç joker karakterleri
Kurallar, tek bir dosyaya işaret etmenin yanı sıra, match /images/{imageId}
gibi, eğik çizgiler de dahil olmak üzere adında belirli bir dize öneki olan herhangi bir dosyayı işaret etmek için joker karakterler kullanabilir.
Yukarıdaki örnekte, eşleşme ifadesi {imageId}
joker karakter sözdizimini kullanır. Bu, kuralın /images/
adının başında /images/profilePhoto.png
veya /images/croppedProfilePhoto.png
gibi herhangi bir dosya için geçerli olduğu anlamına gelir. Match ifadesindeki allow
ifadeleri değerlendirildiğinde, imageId
değişkeni, profilePhoto.png
veya croppedProfilePhoto.png
gibi resim 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, bir Cloud Storage paketi 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.
Tümü /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ına uygulanır, bu nedenle /images/
gövdesinde tanımlanan erişim kontrolleri /mp3s/
gövdesine uygulanmaz. 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
match
match
eklenir. Aşağıdaki iki kural kümesi 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>;
}
}
}
}
tutucu5 l10n-yerservice firebase.storage {
match /b/{bucket}/o {
// Exact match for "images/profilePhoto.png"
match /images/profilePhoto.png {
allow write: if <condition>;
}
}
}
Özyinelemeli eşleşme joker karakterleri
Bir dosya adının sonunda dizelerle eşleşen ve döndüren joker karakterlere ek olarak, joker karakter adına {path=**}
gibi =**
eklenerek daha karmaşık eşleştirme için birden çok segmentli bir joker 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 değerlendirirse true
, sonuç true
olur.
Yukarıdaki kurallarda, "images/profilePhoto.png" dosyası, condition
veya other_condition
doğru olarak değerlendirilirse okunabilirken, "images/users/user:12345/profilePhoto.png" dosyası yalnızca other_condition
sonucuna tabidir. .
Bulut Depolama Güvenlik Kuralları basamaklandırılmaz 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=**}
eşleşmesi, /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.
Özyinelemeli joker karakterler, bir eşleşme ifadesinin 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 kaydolmalısınız. güvenlik kurallarınızın en üstünde:
rules_version = '2';
service cloud.storage {
match /b/{bucket}/o {
...
}
}
Her eşleşme ifadesi için en fazla bir özyinelemeli joker karakteriniz olabilir, ancak sürüm 2'de bu joker karakteri eşleşme 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ıdır. Örneğin, uygulamanız dosya oluşturmada dosya silmeden farklı koşullar uygulamak isteyebilir.
Bir read
işlemi get
ve list
olarak 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 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>; } } } }
Ç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 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;
}
}
}
Yukarıdaki örnekte, dosya adlarının herhangi bir yerinde /images/
dizesine sahip dosyalara yapılan tüm okuma ve yazma işlemlerine izin verilecektir, çünkü ilk kural her zaman false
olsa bile ikinci kural her zaman true
olacaktır.
Kurallar filtre değildir
Verilerinizi güvenceye alıp dosya işlemlerini yapmaya 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ı 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 : 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); }) });
Bulut Depolama Güvenlik Kurallarındaki kurallar, her sorguyu olası sonucuna göre değerlendirir ve istemcinin okuma izninin olmadığı bir dosyayı döndürebiliyorsa isteği başarısız olur. Erişim istekleri, kurallarınız tarafından belirlenen kısıtlamalara uymalıdır.
Sonraki adımlar
Bulut Depolama için Firebase Güvenlik Kuralları konusundaki anlayışınızı derinleştirebilirsiniz:
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ını yapmasına izin veren Kural dilinin bir sonraki ana konseptini, dinamik koşulları öğrenin.
Tipik güvenlik kullanım senaryolarını ve bunlara yönelik Firebase Güvenlik Kuralları tanımlarını inceleyin.
Cloud Storage'a özel Firebase Güvenlik Kuralları kullanım örneklerini inceleyebilirsiniz: