Cloud Firestore Güvenlik Kuralları için yazma koşulları

Bu kılavuz, güvenlik kurallarını yapılandırma kılavuzu üzerine inşa edilmiştir başlıklı makalemize göz atın. Uygun değilseniz Cloud Firestore Güvenlik Kurallarının temellerine aşinaysanız başlangıç sayfasına bakın rehberini inceleyin.

Cloud Firestore Güvenlik Kurallarının birincil yapı taşı koşuldur. CEVAP koşul, belirli bir işlemin gerçekleşip gerçekleşmeyeceğini belirleyen izin verilen veya reddedilmelidir. Veri güvenliği kurallarından faydalanarak kullanıcı kimlik doğrulamasını kontrol edebilir, gelen verileri doğrulayabilir ve hatta yardımcı olur.

Doğrulama

En yaygın güvenlik kuralı modellerinden biri, kullanıcının kimlik doğrulama durumuna Örneğin, uygulamanız oturum açmış kullanıcıların veri yazmasını sağlayın:

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow the user to access documents in the "cities" collection
    // only if they are authenticated.
    match /cities/{city} {
      allow read, write: if request.auth != null;
    }
  }
}

Yaygın olarak kullanılan diğer bir model de kullanıcıların yalnızca kendi telefonlarını okuyup yazabildiğinden emin olmaktır. veri:

service cloud.firestore {
  match /databases/{database}/documents {
    // Make sure the uid of the requesting user matches name of the user
    // document. The wildcard expression {userId} makes the userId variable
    // available in rules.
    match /users/{userId} {
      allow read, update, delete: if request.auth != null && request.auth.uid == userId;
      allow create: if request.auth != null;
    }
  }
}

Uygulamanız Firebase Authentication veya Google Cloud Identity Platform kullanıyorsa request.auth değişkeni Veri isteyen istemcinin kimlik doğrulama bilgileri. request.auth hakkında daha fazla bilgi edinmek için referansa bakın dokümanlarına göz atın.

Veri doğrulama

Birçok uygulama, erişim denetimi bilgilerini veritabanındaki dokümanlarda alanlar olarak depolar. Cloud Firestore Güvenlik Kuralları, belgeye göre erişime dinamik olarak izin verebilir veya erişimi reddedebilir veri:

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow the user to read data if the document has the 'visibility'
    // field set to 'public'
    match /cities/{city} {
      allow read: if resource.data.visibility == 'public';
    }
  }
}

resource değişkeni istenen dokümana işaret eder ve resource.data değişkeni belgede depolanan tüm alanların ve değerlerin bir haritası. Daha fazla resource değişkeni hakkında daha fazla bilgi için referansa dokümanlarına göz atın.

Veri yazarken gelen verileri mevcut verilerle karşılaştırmak isteyebilirsiniz. Bu durumda, kural kümeniz bekleyen yazmaya izin veriyorsa request.resource değişkeni dokümanın gelecekteki durumunu içerir. Yalnızca şu özelliklere sahip update işlemleri için: bir alt kümeyi değiştirmek istediğinizde request.resource değişkeni işlemden sonraki beklemedeki doküman durumunu içermelidir. Alanı kontrol edebilirsiniz. değerleri request.resource içinde ayarlayarak istenmeyen veya tutarsız veri güncellemelerini önleyin:

service cloud.firestore {
  match /databases/{database}/documents {
    // Make sure all cities have a positive population and
    // the name is not changed
    match /cities/{city} {
      allow update: if request.resource.data.population > 0
                    && request.resource.data.name == resource.data.name;
    }
  }
}

Diğer dokümanlara erişme

Güvenlik kurallarınız, get() ve exists() işlevlerini kullanarak gelen isteklerle veri tabanındaki diğer dokümanlar arasında karşılaştırma yapar. get() ve Her iki exists() işlevinin de tam olarak belirtilmiş belge yolları olması gerekir. Bunu kullanırken değişkenlerini oluşturmak istiyorsanız (ör. get() ve exists()) escape değişkenlerini $(variable) söz dizimini kullanarak belirtir.

Aşağıdaki örnekte, database değişkeni, ifadesi match /databases/{database}/documents ve yolu oluşturmak için kullanılır:

service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city} {
      // Make sure a 'users' document exists for the requesting user before
      // allowing any writes to the 'cities' collection
      allow create: if request.auth != null && exists(/databases/$(database)/documents/users/$(request.auth.uid));

      // Allow the user to delete cities if their user document has the
      // 'admin' field set to 'true'
      allow delete: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
    }
  }
}

Yazma işlemleri için getAfter() işlevini kullanarak bir işlem veya yazma grubu tamamlandıktan sonra, ancak taahhüt edilir. get() gibi getAfter() işlevi de tam olarak belirtilen belge yolunu izleyin. Yazma gruplarını tanımlamak için getAfter() kullanabilirsiniz bir işlem veya grup halinde gerçekleşmesi gerekir.

Arama sınırlarına erişim

Kural grubu değerlendirmesi başına doküman erişimi çağrısı sınırı vardır:

  • Tek belgeli istekler ve sorgu istekleri için 10.
  • çoklu belge okumaları, işlemler, için de kullanılabilir. Önceki 10 sınırı her öğe için de geçerlidir. işlemidir.

    Örneğin, 3 yazma bilgisiyle bir toplu yazma isteği oluşturduğunuzu düşünün işlemleri için 2 doküman erişimi çağrısı kullandığını her yazmayı doğrular. Bu durumda, her yazmada 10 erişim çağrısı ve toplu yazma isteği, 20 erişim çağrısından 6'sını kullanır çağrısının en iyi yoludur.

Her iki sınırın da aşılması, "izin verilmedi" hatasıyla sonuçlanır. Bazı dokümanlar erişim çağrıları önbelleğe alınabilir. Önbelleğe alınan çağrılar bu sınıra dahil edilmez.

Bu sınırların işlemleri nasıl etkilediği hakkında ayrıntılı bir açıklama için toplu yazma işlemleri için atomik işlemleri güvenli hale getirme kılavuzuna bakın.

Aramalara ve fiyatlandırmaya erişin

Bu işlevleri kullanmak veritabanınızda bir okuma işlemi yürütür. Yani kurallarınız reddetse bile belgeleri okumak için faturalandırılırsınız talep ediyor. Cloud Firestore Fiyatlarını inceleyin bakın.

Özel işlevler

Güvenlik kurallarınız 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 güvenlik kuralları 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ütemez veya harici hizmetlerdir.
  • İşlevler, kapsamdaki işlevlere ve değişkenlere otomatik olarak erişebilir bir belgedir. Örneğin, service cloud.firestore kapsamının resource değişkenine erişimi var ve get() ile exists() gibi yerleşik işlevler.
  • İşlevler diğer işlevleri çağırabilir ancak yinelenmeyebilir. Toplam çağrı yığın derinliği 10 ile sınırlıdır.
  • v2 kural sürümünde, işlevler let anahtar kelimesini kullanarak değişkenler tanımlayabilir. İşlevlerin en fazla 10 izin bağlaması olabilir, ancak dönüş ile bitmesi gerekir 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 cloud.firestore {
  match /databases/{database}/documents {
    // 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 /cities/{city} {
      allow read, write: if signedInOrPublic();
    }

    match /users/{user} {
      allow read, write: if signedInOrPublic();
    }
  }
}

Güvenlik kurallarınızdaki işlevleri kullanmak, artar.

Kurallar filtre değildir

Verilerinizin güvenliğini sağladıktan ve sorgu yazmaya başladıktan sonra, güvenliğin kuralları filtre değildir. Bir Cloud Firestore'un yalnızca geçerli istemcinin erişim izni vardır.

Örneğin, aşağıdaki güvenlik kuralını ele alalım:

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow the user to read data if the document has the 'visibility'
    // field set to 'public'
    match /cities/{city} {
      allow read: if resource.data.visibility == 'public';
    }
  }
}

Reddedildi: Bu kural, sonuç kümesi visibility öğesinin public olmadığı belgeleri içerebilir:

. Ağ
db.collection("cities").get()
    .then(function(querySnapshot) {
        querySnapshot.forEach(function(doc) {
            console.log(doc.id, " => ", doc.data());
    });
});

İzin verildi: where("visibility", "==", "public") yan tümcesi sonuç kümesinin kuralın koşulunu karşıladığını garanti ettiğinden bu kural, aşağıdaki sorguya izin verir:

. Ağ
db.collection("cities").where("visibility", "==", "public").get()
    .then(function(querySnapshot) {
        querySnapshot.forEach(function(doc) {
            console.log(doc.id, " => ", doc.data());
        });
    });

Cloud Firestore güvenlik kuralları, her sorguyu potansiyeline göre değerlendirir bir doküman döndürebiliyorsa ve istek başarısız olursa, okuma izni yok. Sorgular, emin olmanız gerekir. Güvenlik kuralları ve sorgular hakkında daha fazla bilgi için bkz. güvenli daha fazla bilgi edinin.

Sonraki adımlar