Cloud Storage dili için Firebase Güvenlik Kurallarının temel söz dizimini öğrenin

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:

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: