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 Cloud Firestore Security Rules cihazınıza nasıl koşul ekleyeceğinizi gösterin. Uygun değilseniz Cloud Firestore Security Rules hakkında temel bilgilere aşinaysanız başlangıç bölümüne bakın rehberini inceleyin.

Cloud Firestore Security Rules öğesinin birincil yapı taşı koşuldur. Koşul, belirli bir işleme izin verilip verilmeyeceğini belirleyen bir boole ifadesidir. 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 Security Rules, doküman verilerine göre erişime dinamik olarak izin verebilir veya erişimi reddedebilir:

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, bir işlem veya yazma grubu tamamlandıktan sonra ancak işlem veya grup taahhüt edilmeden önce bir belgenin durumuna erişmek üzere getAfter() işlevini kullanabilirsiniz. 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 belge erişimi çağrıları için bir 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 yolu.

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. Daha ayrıntılı faturalandırma bilgileri için Cloud Firestore Fiyatlandırma başlıklı makaleyi inceleyin.

Ö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. Bu işlevler ek mantık içeremez. Ö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ında tanımlanan bir işlev, resource değişkenine ve get() ile exists() gibi yerleşik işlevlere erişebilir.
  • İş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. İşlevlerde en fazla 10 izin bağlaması bulunabilir ancak geri dönüş 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, yukarıdaki örneklerde kullanılan iki koşul türünü tek bir işlevde birleştirmek isteyebilirsiniz:

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 ve Cloud Firestore ürününün yalnızca şu belgeleri içeren dokümanları döndürmesini bekleyin: 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:

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:

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

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

Sonraki adımlar