Firebase Cloud Storage Güvenlik Kurallarında koşulları kullanma

Bu kılavuz, Firebase Security Rules dilinin temel söz dizimini öğrenme kılavuzunu temel almaktadır Cloud Storage için Firebase Security Rules cihazınıza nasıl koşul ekleyeceğinizi gösterin.

Cloud Storage Security Rules öğesinin birincil yapı taşı koşuldur. CEVAP koşul, belirli bir işlemin gerçekleşip gerçekleşmeyeceğini belirleyen izin verilen veya reddedilmelidir. Temel kurallar için true ve false değişmez değerlerini kullanma çok iyi çalışıyor. Ancak Cloud Storage için Firebase Security Rules dili, daha karmaşık koşullar yazmanızı sağlar. Bu koşullar sayesinde:

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

Doğrulama

Cloud Storage için Firebase Security Rules, Cloud Storage'a güçlü kullanıcı tabanlı kimlik doğrulama sağlamak için Firebase Authentication ile entegre olur. Bu da Firebase Authentication jetonunun taleplerine göre ayrıntılı erişim denetimi.

Kimliği doğrulanmış bir kullanıcı Cloud Storage adresine istek gönderdiğinde request.auth değişkeni, kullanıcının uid (request.auth.uid) değerinin yanı sıra Firebase Authentication JWT'sinin (request.auth.token) iddialarıyla doldurulur.

Ayrıca, özel kimlik doğrulama kullanılırken ek hak talepleri gösterilir request.auth.token alanına girin.

Kimliği doğrulanmamış bir kullanıcı istek gönderdiğinde request.auth değişkeni null olur.

Bu veriler kullanılarak, güvenliği sağlamak için kimlik doğrulamayı kullanmanın dosyalar:

  • Herkese açık: request.auth adlı kullanıcıyı yoksay
  • Kimliği gizli: request.auth değerinin null olmadığından emin olun
  • Kullanıcı gizli: request.auth.uid değerinin uid yolu ile aynı olup olmadığını kontrol edin
  • Grup gizli: Özel jetonun iddialarını seçilen bir taleple eşleşecek şekilde kontrol edin veya Bir meta veri alanının var olup olmadığını görmek için dosya meta verilerini okuma

Herkese açık

request.auth bağlamını dikkate almayan tüm kurallar Kullanıcının kimlik doğrulama bağlamını dikkate almadığı için public kuralı. Bu kurallar, oyun öğeleri, ses dosyaları veya diğer statik içerikler gibi herkese açık verileri göstermek için yararlı 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ış gizli

Bazı durumlarda, kimliği doğrulanmış tüm kullanıcılar tarafından görüntülenebilir tarafından değil, kimliği doğrulanmamış kullanıcılar tarafından gerçekleştirilmesine izin verilir. request.auth tarihinden beri değişkeni kimliği doğrulanmamış tüm kullanıcılar için null olarak ayarlanırsa tek yapmanız gereken request.auth değişkeni, kimlik doğrulamayı zorunlu kılmak için mevcut:

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

Kullanıcıya gizli

Şu ana kadar request.auth için en yaygın kullanım alanı, kullanıcılara daha ayrıntılı izinlere sahip kullanıcılar: profil resimleri yüklemek okumayı öğretiyor.

Cloud Storage içindeki dosyalar tam bir "yola" sahip olduğundan dosyayı yüklemeye çalışın. bir dosyanın sahibi olan benzersiz, kullanıcıyı tanımlayan benzersiz bir dosya adı ön ekinde (kullanıcının uid gibi) yer alan, kontrol edilir:

// 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;
}

Grubu gizli

Yine yaygın bir kullanım alanı, bir nesnede grup izinlerine izin vermektir (ör. birkaç ekip üyesinin paylaşılan bir dokümanda ortak çalışmasına izin verme). Orada bunu yaparken kullanabileceğiniz çeşitli yaklaşımlar vardır:

  • Firebase Authentication özel jeton bastırın bir grup üyesi hakkında ek bilgiler (grup kimliği gibi) içeren
  • Grup bilgilerini (grup kimliği veya yetkili uid listesi gibi) dosya meta verileri

Bu veriler jetonda veya dosya meta verilerinde depolandıktan sonra bir kuraldan referans verilebilir:

// 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 İsteme

Yüklemeler, indirmeler, meta veri değişiklikleri ve silme işlemleri Cloud Storage alıcısına request gönderildi. Kullanıcının benzersiz kimliğine ve yukarıda açıklandığı gibi request.auth nesnesindeki Firebase Authentication yükü, request değişkeni, isteğin gerçekleştiği dosya yolunu içerir isteğin alındığı saat ve yeni resource değeri .

request nesnesi ayrıca kullanıcının benzersiz kimliğini ve request.auth nesnesinde Firebase Authentication yükü olacak. Kullanıcı Tabanlı Güvenlik bölümünde daha ayrıntılı olarak açıklanmıştır bölümünde bulabilirsiniz.

request nesnesindeki özelliklerin tam listesini aşağıda bulabilirsiniz:

Özellik Tür Açıklama
auth eşleme<dize, dize> Kullanıcı giriş yaptığında uid, kullanıcının benzersiz kimliğini ve token, Firebase Authentication JWT hak talebinin haritası. Aksi takdirde null
params eşleme<dize, dize> İsteğin sorgu parametrelerini içeren eşleme.
path yol İsteğin yapıldığı yolu temsil eden bir path gerçekleştiriliyor.
resource eşleme<dize, dize> Yeni kaynak değeri (yalnızca write isteklerinde bulunur).
time zaman damgası İsteğin değerlendirildiği sunucu zamanını temsil eden zaman damgası.

Kaynak Değerlendirme

Kuralları değerlendirirken dosyanın meta verilerini de değerlendirmek isteyebilirsiniz. yükleme, indirme, değiştirme veya silme işlemlerini yapabilir. Bu sayede, 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 verme gibi işlemleri yapan karmaşık ve güçlü kurallar oluşturabilirsiniz.

Cloud Storage için Firebase Security Rules, dosya meta verilerini resource içinde sağlar ortaya çıkan meta verinin anahtar/değer çiftlerini içeren nesne Cloud Storage nesne algılandı. Bu özellikler read veya Veri bütünlüğünü sağlamak için write istekleri.

write isteklerinde (yüklemeler, meta veri güncellemeleri ve silmeler gibi), dosyanın dosya meta verilerini içeren resource nesnesine ek varsa, istek yolunda bulunan URL'leri de request.resource nesnesi içerir ve bu, oluşturulacak dosya meta verilerinin bir alt kümesini içerir yazılması gerekir. Bu iki değeri, uygulamanızın veya dosya türü ya da boyutu gibi uygulama kısıtlamaları uygulayabilirsiniz.

resource nesnesindeki özelliklerin tam listesini aşağıda bulabilirsiniz:

Özellik Tür Açıklama
name dize Nesnenin tam adı
bucket dize Bu nesnenin bulunduğu paketin adı.
generation int Google Cloud Storage nesne oluşturma.
metageneration int Google Cloud Storage nesne meta oluşturma işlemi gerçekleştirmeniz gerekir.
size int Nesnenin bayt cinsinden boyutu.
timeCreated zaman damgası Bir nesnenin oluşturulduğu zamanı gösteren zaman damgası.
updated zaman damgası Bir nesnenin en son güncellendiği zamanı gösteren zaman damgası.
md5Hash dize Nesnenin MD5 karması.
crc32c dize Nesnenin crc32c karması.
etag dize Bu nesneyle ilişkilendirilen etag.
contentDisposition dize Bu nesneyle ilişkilendirilen içerik yapısı.
contentEncoding dize Bu nesneyle ilişkilendirilen içerik kodlaması.
contentLanguage dize Bu nesneyle ilişkilendirilen içerik dili.
contentType dize Bu nesneyle ilişkilendirilen içerik türü.
metadata eşleme<dize, dize> Geliştirici tarafından belirtilen ek özel meta verilerin anahtar/değer çiftleri.

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

Cloud Firestore ile iyileştir

Diğer yetkilendirmeleri değerlendirmek için Cloud Firestore uygulamasındaki dokümanlara erişebilirsiniz ölçütlerine bağlıdır.

firestore.get() ve firestore.exists() işlevlerini kullanarak güvenliğiniz kuralları, gelen istekleri Cloud Firestore kapsamındaki dokümanlarla karşılaştırarak değerlendirebilir. Hem firestore.get() hem de firestore.exists() işlevleri tam olarak bekleniyor belirtilen belge yollarında geçerlidir. Değişkenleri kullanarak firestore.get() ve firestore.exists() için açıkça çıkış yapmanız gerekir değişkenleri için $(variable) söz dizimini kullanır.

Aşağıdaki örnekte, yalnızca bu kullanıcıların dosyalarına okuma erişimini veya belirli kulüplerin üyesi olan kullanıcılar.

service firebase.storage {
  match /b/{bucket}/o {
    match /users/{club}/files/{fileId} {
      allow read: if club in
        firestore.get(/databases/(default)/documents/users/$(request.auth.id)).memberships
    }
  }
}
Sonraki örnekte, kullanıcının fotoğraflarını yalnızca kullanıcının arkadaşları görebilir.
service firebase.storage {
  match /b/{bucket}/o {
    match /users/{userId}/photos/{fileId} {
      allow read: if
        firestore.exists(/databases/(default)/documents/users/$(userId)/friends/$(request.auth.id))
    }
  }
}

Bu Cloud Firestore değerlerini kullanan ilk Cloud Storage Security Rules oluşturup kaydettikten sonra işlevleri için Firebase konsolunda veya Firebase KSA'da iki ürünü bağlamak için izinleri etkinleştirin.

Firebase Security Rules'i yönetme ve dağıtma bölümünde açıklandığı gibi bir IAM rolünü kaldırarak bu özelliği devre dışı bırakabilirsiniz.

Verileri doğrulama

Cloud Storage için Firebase Security Rules, aşağıdakiler dahil olmak üzere veri doğrulama amacıyla da kullanılabilir: Dosya adı ve yolunun yanı sıra 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 Security Rules daha karmaşık hale geldikçe, farklı koşulları yerine getirerek, kural kümenizde yeniden kullanabilirsiniz. Güvenlik kuralları özel işlevleri destekleyin. Özel işlevlerin söz dizimi biraz JavaScript'e benzer, ancak Firebase Security Rules işlevleri alana özgü bir dilde yazılmış bazı önemli sınırlamaları vardır:

  • İşlevler yalnızca tek bir return ifadesi içerebilir. Yapamayacakları mantıktan ibaret değildir. Örneğin, döngüleri yürütemezler. veya harici hizmetleri arayın.
  • İşlevler, kapsamdaki işlevlere ve değişkenlere otomatik olarak erişebilir bir belgedir. Örneğin, service firebase.storage kapsamı, resource değişkeni ve yalnızca Cloud Firestore için yerleşik işlevler get() ve exists() gibi.
  • İşlevler diğer işlevleri çağırabilir ancak yinelenmeyebilir. Toplam çağrı yığın derinliği 10 ile sınırlıdır.
  • rules2 sürümünde işlevler, let anahtar kelimesini kullanarak değişkenler tanımlayabilir. İşlevler herhangi bir sayıda izin bağlamasına sahip olabilir ancak bir döndürme ile bitmelidir. ifade eder.

Bir fonksiyon, function anahtar kelimesiyle tanımlanır ve sıfır ya da daha fazla alan alır bağımsız değişkenlerdir. Örneğin, 2023 Yılbaşı İndirimi adında kullanılan iki koşul aşağıdaki örneklerde tek bir işleve dönüştürürsünüz:

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 Security Rules içinde işlevlerin kullanılması, karmaşıklık bakımından bu işlevlerin sürdürülebilirliğinin daha kolay olmasını sağlar. büyür.

Sonraki adımlar

Koşullarla ilgili olan bu konuşmadan sonra, anlayabildiği ve şunları yapmaya hazır olduğu anlamına gelir:

Temel kullanım alanlarını ele almayı öğrenin ve uygulama geliştirme, kuralları test etme ve dağıtma: