Cloud Storage için Firebase Güvenlik Kuralları dilinin temel sözdizimini öğ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 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>;
      }
  }
}

Özyinelemeli 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çerebilmektedir:

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: