Google, Siyah topluluklar için ırksal eşitliği ilerletmeye kararlıdır. Nasıl olduğunu gör.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

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

Bu kılavuz, Cloud Firestore Güvenlik Kurallarınıza nasıl koşul ekleneceğini göstermek için yapılandırma güvenlik kuralları kılavuzuna dayanmaktadır. Eğer Bulut Firestore Güvenlik Kuralları temel aşina değilseniz, bkz başlangıç kılavuzu.

Cloud Firestore Güvenlik Kurallarının birincil yapı taşı koşuludur. Koşul, belirli bir işleme izin verilip verilmeyeceğini belirleyen bir boole ifadesidir. Kullanıcı kimlik doğrulamasını kontrol eden, gelen verileri doğrulayan ve hatta veritabanınızın diğer bölümlerine erişen koşulları yazmak için güvenlik kurallarını kullanın.

Kimlik Doğrulama

En yaygın güvenlik kuralı kalıplarından biri, kullanıcının kimlik doğrulama durumuna göre erişimi denetlemektir. Örneğin, uygulamanız yalnızca oturum açmış kullanıcıların veri yazmasına izin vermek isteyebilir:

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

Bir başka yaygın model, kullanıcıların yalnızca kendi verilerini okuyabilmelerini ve yazabilmelerini sağlamaktır:

 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 Kimlik Doğrulaması kullanıyorsa, request.auth değişkeni, veri isteyen istemcinin kimlik doğrulama bilgilerini içerir. request.auth hakkında daha fazla bilgi için başvuru belgelerine bakın .

Veri doğrulama

Birçok uygulama, erişim denetim bilgilerini veritabanındaki belgelerdeki alanlar olarak depolar. Cloud Firestore Güvenlik Kuralları, belge 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 belgeyi belirtir ve resource.data belgede depolanan tüm alanların ve değerlerin bir haritasıdır. resource değişkeni hakkında daha fazla bilgi için başvuru belgelerine bakı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 belgenin gelecekteki durumunu içerir. Belge alanlarının yalnızca bir alt kümesini değiştiren update işlemleri için request.resource değişkeni, işlemden sonra bekleyen belge durumunu içerir. İstenmeyen veya tutarsız veri güncellemelerini önlemek için request.resource içindeki alan değerlerini kontrol edebilirsiniz:

 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 belgelere erişme

Get get() ve exists() işlevlerini kullanarak, güvenlik kurallarınız veritabanındaki diğer belgelere karşı gelen istekleri değerlendirebilir. get() ve exists() işlevlerinin her ikisi de tam olarak belirtilen belge yollarını bekler. Get get() ve exists() yollarını oluşturmak get() değişkenleri kullanırken, $(variable) sözdizimini kullanarak değişkenlerden açıkça kaçmanız gerekir.

Aşağıdaki örnekte, database değişkeni match deyimi match /databases/{database}/documents tarafından yakalanır 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
    }
  }
}
 

getAfter() işlemleri için, bir işlem veya yazma grubu tamamlandıktan sonra ancak işlem veya toplu işlem tamamlanmadan önce belgenin durumuna erişmek için getAfter() işlevini kullanabilirsiniz. getAfter() get() gibi, getAfter() işlevi de tam olarak belirtilen bir belge yolunu kullanır. Bir işlem veya toplu işlem olarak birlikte yapılması gereken yazma kümelerini tanımlamak için getAfter() kullanabilirsiniz.

Çağrı sınırlarına erişin

Kural kümesi değerlendirmesi başına doküman erişim çağrılarında bir sınırlama vardır:

  • 10 tek belge istekleri ve sorgu istekleri için.
  • 20 çoklu belge okumaları, işlemleri ve toplu yazma işlemleri için. Önceki işlem sınırı, her işlem için de geçerlidir.

    Örneğin, 3 yazma işlemiyle toplu bir yazma isteği oluşturduğunuzu ve güvenlik kurallarınızın her yazmayı doğrulamak için 2 belge erişim çağrısı kullandığını düşünün. Bu durumda, her yazma 10 erişim çağrısının 2'sini kullanır ve toplu yazma isteği 20 erişim çağrısının 6'sını kullanır.

Bu sınırlardan herhangi birinin aşılması, izin reddedildi hatasıyla sonuçlanır. Bazı belge erişim çağrıları önbelleğe alınabilir ve önbellek çağrıları sınırlara dahil edilmez.

Bu sınırların işlemleri ve toplu yazıları nasıl etkilediğine ilişkin ayrıntılı bir açıklama için atomik işlemlerin güvenliğini sağlama kılavuzuna bakın.

Çağrılara ve ücretlendirmeye erişin

Bu işlevleri kullanmak, veritabanınızda bir okuma işlemi yürütür; bu, kurallarınız isteği reddetse bile belgeleri okumak için faturalandırılacağınız anlamına gelir. Daha spesifik fatura bilgileri için Cloud Firestore Fiyatlandırmasına bakın.

Özel işlevler

Güvenlik kurallarınız daha karmaşık hale geldikçe, kural kümenizde yeniden kullanabileceğiniz işlevlerde koşul kümelerini sarmak isteyebilirsiniz. Güvenlik kuralları özel işlevleri destekler. Özel işlevlerin sözdizimi biraz JavaScript gibidir, ancak güvenlik kuralları işlevleri bazı önemli sınırlamaları olan etki alanına özgü bir dilde yazılır:

  • İşlevler yalnızca tek bir return ifadesi içerebilir. Ek mantık içeremezler. Örneğin, döngüler yürütemez veya harici hizmetleri çağıramazlar.
  • İşlevler, işlevlere ve değişkenlere tanımlandıkları kapsamdan otomatik olarak erişebilir. Örneğin, içinde tanımlanmış bir işlev service cloud.firestore kapsamı erişimi olan resource değişken ve yerleşik işlevleri gibi get() ve exists() .
  • Fonksiyonlar başka fonksiyonlar çağırabilir, ancak geri çekilemez. Toplam çağrı yığını derinliği 10 ile sınırlıdır.
  • Kural sürümü v2 , işlevler let anahtar sözcüğünü kullanarak değişkenleri tanımlayabilir. İşlevler 10 taneye kadar izinli bağlama içerebilir, ancak bir return ifadesiyle bitmelidir.

Bir işlev, function anahtar sözcüğüyle tanımlanır ve sıfır veya daha fazla bağımsız değişken alır. Örneğin, yukarıdaki örneklerde kullanılan iki tür koşulu 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, kurallarınızın karmaşıklığı arttıkça onları daha sürdürülebilir hale getirir.

Kurallar filtre değildir

Verilerinizi koruduktan ve sorgu yazmaya başladığınızda, güvenlik kurallarının filtre olmadığını unutmayın. Bir koleksiyondaki tüm belgeler için sorgu yazamaz ve Cloud Firestore'un yalnızca geçerli istemcinin erişim iznine sahip olduğu belgeleri döndürmesini bekleyemezsiniz.

Örneğin, aşağıdaki güvenlik kuralını uygulayın:

 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 : Sonuç kümesi visibility public olmadığı belgeleri içerebileceğinden, bu kural aşağıdaki sorguyu reddeder:

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 sorguyu sağlar:

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 potansiyel sonucuna göre değerlendirir ve istemcinin okuma iznine sahip olmadığı bir belgeyi döndürürse isteği başarısız olur. Sorgular, güvenlik kurallarınız tarafından belirlenen kısıtlamalara uymalıdır. Güvenlik kuralları ve sorguları hakkında daha fazla bilgi için bkz. Verileri güvenli bir şekilde sorgulama .

Sonraki adımlar