Firebase Bulut Depolama Güvenlik Kurallarında kullanım koşulları

Üzerindeki bu kılavuz oluşturur Firebase Güvenlik Kuralları dil çekirdek sözdizimi öğrenmek Bulut Depolama için Firebase Güvenlik Kuralları koşulları nasıl ekleneceğini gösteren kılavuz.

Bulut Depolama Güvenliği Kuralları birincil yapı taşı durumdur. Bir koşul, belirli bir işleme izin verilip verilmeyeceğini belirleyen bir boole ifadesidir. Temel kuralları için kullanan true ve false koşulları gibi değişmezleri prefectly iyi çalışıyor. Ancak, Cloud Storage dili için Firebase Güvenlik Kuralları, size aşağıdakileri yapabilen daha karmaşık koşullar yazmanın yollarını sunar:

  • Kullanıcı kimlik doğrulamasını kontrol edin
  • Gelen verileri doğrula

kimlik doğrulama

Cloud Storage için Firebase Güvenlik Kuralları, Cloud Storage'a güçlü kullanıcı tabanlı kimlik doğrulama sağlamak için Firebase Authentication ile entegre olur. Bu, bir Firebase Kimlik Doğrulama belirtecinin iddialarına dayalı olarak ayrıntılı erişim kontrolüne izin verir.

Bir kullanıcının gerçekleştirdiği işlemlere Bulut Depolama karşı bir istek doğrulanmış zaman, request.auth değişken kullanıcının doldurulur uid ( request.auth.uid de Firebase Kimlik JWT'de (istemlerinde gibi) request.auth.token ).

Özel kimlik doğrulaması kullanarak, ayrıca, ek talepleri su yüzüne edilir request.auth.token alanında.

Kimliği doğrulanmamış bir kullanıcının bir istek gerçekleştirdiğinde, request.auth değişkendir null .

Bu verileri kullanarak, dosyaların güvenliğini sağlamak için kimlik doğrulamayı kullanmanın birkaç yaygın yolu vardır:

  • Kamu: görmezden request.auth
  • Özel Doğrulandı: çek o request.auth değil null
  • Kullanıcı özel: check request.auth.uid bir yol eşittir uid
  • Özel grup: seçilen bir taleple eşleşmek için özel belirtecin taleplerini kontrol edin veya bir meta veri alanı olup olmadığını görmek için dosya meta verilerini okuyun

Halk

Dikkate almayan bir kural request.auth bağlamını bir kabul edilebilir public kullanıcıya kimlik doğrulama bağlamı dikkate almaz, çünkü kural. Bu kurallar, oyun varlıkları, ses dosyaları veya diğer statik içerik gibi genel verileri ortaya çıkarmak için faydalı olabilir.

// Anyone to read a public image if the file is less than 100kB
// Anyone can upload a public file ending in '.txt'
match /public/{imageId} {
  allow read: if resource.size < 100 * 1024;
  allow write: if imageId.matches(".*\\.txt");
}

Kimliği doğrulanmış özel

Bazı durumlarda, verilerin kimliği doğrulanmamış kullanıcılar tarafından değil, uygulamanızın tüm kimliği doğrulanmış kullanıcıları tarafından görüntülenmesini isteyebilirsiniz. Yana request.auth değişkendir null tüm kimliği doğrulanmamış kullanıcılar için, yapmanız gereken tek şey kontrol etmektir request.auth değişken kimlik doğrulaması gerektiren için vardır:

// Require authentication on all internal image reads
match /internal/{imageId} {
  allow read: if request.auth != null;
}

kullanıcı özel

Bugüne kadar en yaygın kullanım şeklidir request.auth yükleme profili resimlerden özel belgeleri okumaya: onların dosyalar üzerinde granül izinlere sahip bireysel kullanıcılara sunmak için olacaktır.

Bulut Depolama dosyaları dosyaya tam "yol" olduğundan, bir kullanıcı tarafından kontrol edilen bir dosyayı yapmak için gereken tüm bilgileri (kullanıcının olarak dosya adı öneki benzersiz kullanıcı tanımlama bilgilerinin bir parçasıdır uid kontrol edilebilir) kural değerlendirildiğinde:

// Only a user can upload their profile picture, but anyone can view it
match /users/{userId}/profilePicture.png {
  allow read;
  allow write: if request.auth.uid == userId;
}

Grup özel

Eşit derecede yaygın bir başka kullanım durumu, birkaç ekip üyesinin paylaşılan bir belge üzerinde işbirliği yapmasına izin vermek gibi bir nesne üzerinde grup izinlerine izin vermek olacaktır. Bunu yapmak için birkaç yaklaşım vardır:

  • Nane Firebase Kimlik belirteç özel ki (bu tür bir grup kimliği gibi) bir grup üyesi ile ilgili ayrıntılı bilgiler içermektedir
  • (Böyle bir grup kimliği veya yetkili listesi olarak grup bilgileri dahil uid içinde s) dosya meta verileri

Bu veriler belirteç veya dosya meta verilerinde depolandıktan sonra, bir kural içinden referans alınabilir:

// Allow reads if the group ID in your token matches the file metadata's `owner` property
// Allow writes if the group ID is in the user's custom token
match /files/{groupId}/{fileName} {
  allow read: if resource.metadata.owner == request.auth.token.groupId;
  allow write: if request.auth.token.groupId == groupId;
}

Değerlendirme Talebi

Yüklenen, indirme, meta veri değişiklikleri ve siler kullanılarak değerlendirilir request Cloud Storage gönderdi. Kullanıcının benzersiz bir kimlik ve Firebase Doğrulama yük ek olarak request.auth yukarıda tarif edildiği gibi bir nesne, request değişken talebi yapılmaktadır dosya yolu, istek alındığında zaman ve yeni içeren resource değeri ise istek bir yazıdır. HTTP üstbilgileri ve kimlik doğrulama durumu da dahildir.

request nesne, kullanıcının benzersiz bir kimlik ve Firebase Kimlik yükünü içerir request.auth de açıklanacaktır nesne, kullanıcı Tabanlı Güvenliği dokümanların bölümü.

Mülklerin tam listesi request nesne aşağıda verilmiştir:

Mülk Tip Tanım
auth map<string, string> Kaydedilir kullanıcı, sağladığında uid , kullanıcının benzersiz bir kimlik ve token Firebase Kimlik JWT iddiaların bir harita. Aksi takdirde olacak null .
params map<string, string> İsteğin sorgu parametrelerini içeren harita.
path yol Bir path talep gerçekleştirilir olan yolu temsil eder.
resource map<string, string> Yeni kaynak değeri, yalnızca mevcut write istekleri.
time zaman damgası İsteğin değerlendirildiği sunucu saatini temsil eden bir zaman damgası.

Kaynak Değerlendirmesi

Kuralları değerlendirirken, yüklenen, indirilen, değiştirilen veya silinen dosyanın meta verilerini de değerlendirmek isteyebilirsiniz. Bu, yalnızca belirli içerik türlerine sahip dosyaların yüklenmesine veya yalnızca belirli bir boyuttan büyük dosyaların silinmesine izin vermek gibi şeyler yapan karmaşık ve güçlü kurallar oluşturmanıza olanak tanır.

Bulut Depolama için Firebase Güvenlik Kuralları dosya meta verileri sağlar resource meta anahtar / değer çiftleri bir Cloud Storage nesnesi su yüzüne içeren nesnenin. Bu özellikler üzerinde kontrol edilebilir read veya write veri bütünlüğünü sağlamak için istekleri.

Açık write (örneğin yüklemeler, meta veri güncellemeleri ve siler gibi) istekleri, ek olarak resource şu anda istek yolda, aynı zamanda kullanma yeteneği var var dosya için dosya meta verileri içeren nesne, request.resource nesnesini bu, yazmaya izin veriliyorsa yazılacak dosya meta verilerinin bir alt kümesini içerir. Veri bütünlüğünü sağlamak veya dosya türü veya boyutu gibi uygulama kısıtlamalarını zorlamak için bu iki değeri kullanabilirsiniz.

Mülklerin tam listesi resource nesne aşağıda verilmiştir:

Mülk Tip Tanım
name sicim Nesnenin tam adı
bucket sicim Bu nesnenin bulunduğu paketin adı.
generation int Google Bulut Depolama nesne nesil bu nesnenin.
metageneration int Google Bulut Depolama nesne metageneration bu nesnenin.
size int Nesnenin bayt cinsinden boyutu.
timeCreated zaman damgası Bir nesnenin oluşturulduğu zamanı temsil eden bir zaman damgası.
updated zaman damgası Bir nesnenin en son güncellendiği zamanı temsil eden bir zaman damgası.
md5Hash sicim Nesnenin bir MD5 karması.
crc32c sicim Nesnenin bir crc32c karması.
etag sicim Bu nesneyle ilişkili etag.
contentDisposition sicim Bu nesneyle ilişkili içerik düzeni.
contentEncoding sicim Bu nesneyle ilişkili içerik kodlaması.
contentLanguage sicim Bu nesneyle ilişkili içerik dili.
contentType sicim Bu nesneyle ilişkili içerik türü.
metadata map<string, string> Ek, geliştirici tarafından belirtilen özel meta verilerin anahtar/değer çiftleri.

request.resource hariç bunların tümünü içeren generation , metageneration , etag , timeCreated ve updated .

Verileri doğrula

Bulut Depolama için Firebase Güvenlik Kuralları ayrıca dosya adını ve yolunu yanı sıra gibi dosya meta özelliklerini doğrulayarak dahil veri doğrulama için kullanılabilecek contentType ve size .

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      // Only allow uploads of any image file that's less than 5MB
      allow write: if request.resource.size < 5 * 1024 * 1024
                   && request.resource.contentType.matches('image/.*');
    }
  }
}

Özel işlevler

Firebase Güvenlik Kurallarınız daha karmaşık hale geldikçe, kural kümenizde yeniden kullanabileceğiniz işlevlerdeki koşul kümelerini sarmak isteyebilirsiniz. Güvenlik kuralları özel işlevleri destekler. Özel işlevlerin sözdizimi biraz JavaScript'e benzer, ancak Firebase Güvenlik Kuralları işlevleri, bazı önemli sınırlamaları olan etki alanına özgü bir dilde yazılmıştır:

  • Fonksiyonlar sadece tek içerebilir return deyimi. Herhangi bir ek mantık içeremezler. Örneğin, döngü yürütemezler veya harici hizmetleri çağıramazlar.
  • Fonksiyonlar, tanımlandıkları kapsamdaki fonksiyonlara ve değişkenlere otomatik olarak erişebilir. Örneğin, içinde tanımlanmış bir işlev service firebase.storage kapsamı erişimi olan resource değişkeni, ve Bulut Firestore için sadece, yerleşik işlevleri gibi get() ve exists() .
  • Fonksiyonlar diğer fonksiyonları çağırabilir ancak tekrarlamayabilir. Toplam çağrı yığını derinliği 10 ile sınırlıdır.
  • Versiyon olarak rules2 , fonksiyonlar kullanarak değişkenleri tanımlayabilirsiniz let anahtar sözcüğü. İşlevler herhangi bir sayıda let bağlamasına sahip olabilir, ancak bir return ifadesi ile bitmelidir.

Bir fonksiyon ile tanımlanır function anahtar kelime ve sıfır veya daha fazla bağımsız değişkeni alır. Örneğin, yukarıdaki örneklerde kullanılan iki tür koşulu tek bir işlevde birleştirmek isteyebilirsiniz:

service firebase.storage {
  match /b/{bucket}/o {
    // True if the user is signed in or the requested data is 'public'
    function signedInOrPublic() {
      return request.auth.uid != null || resource.data.visibility == 'public';
    }
    match /images/{imageId} {
      allow read, write: if signedInOrPublic();
    }
    match /mp3s/{mp3Ids} {
      allow read: if signedInOrPublic();
    }
  }
}

Firebase Güvenlik Kurallarınızdaki işlevleri kullanmak, kurallarınızın karmaşıklığı arttıkça onları daha sürdürülebilir hale getirir.

Sonraki adımlar

Koşullarla ilgili bu tartışmadan sonra, daha gelişmiş bir Kural anlayışına sahip olursunuz ve şunları yapmaya hazırsınız:

Temel kullanım senaryolarının nasıl ele alınacağını öğrenin ve Kuralları geliştirmek, test etmek ve dağıtmak için iş akışını öğrenin: