Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

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

Bu kılavuz, Cloud Firestore Güvenlik Kurallarınıza nasıl koşullar ekleyeceğinizi 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şuldur. Bir 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 kontrol etmektir. Ö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;
    }
  }
}

Diğer bir yaygın model, kullanıcıların yalnızca kendi verilerini okuyup yazabildiğinden emin olmaktı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 Authentication veya Google Cloud Identity Platform kullanıyorsa request.auth değişkeni, veri isteyen istemci için 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 denetimi bilgilerini veritabanındaki belgelerde alanlar olarak depolar. Cloud Firestore Güvenlik Kuralları, belge verilerine dayalı olarak 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 belgeye başvurur 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çerecektir. İ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şin

güvenlik kurallarınız get() ve exists() işlevlerini kullanarak, gelen istekleri veritabanındaki diğer belgelere göre değerlendirebilir. get() ve exists() işlevlerinin her ikisi de tam olarak belirtilen belge yollarını bekler. get() ve exists() için yollar 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, eşleşme ifadesi 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 toplu yazma işlemi tamamlandıktan sonra ancak işlem veya toplu işlem tamamlanmadan önce bir belgenin durumuna erişmek için getAfter() işlevini kullanabilirsiniz. get() gibi, getAfter() işlevi de tam olarak belirtilen bir belge yolunu alır. Bir işlem veya toplu iş olarak birlikte gerçekleşmesi gereken yazma kümelerini tanımlamak için getAfter() ı kullanabilirsiniz.

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

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

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

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

Her iki sınırın da aşılması, izin reddedildi hatasıyla sonuçlanır. Bazı belge erişim aramaları önbelleğe alınabilir ve önbelleğe alınan aramalar sınırlara dahil edilmez.

Bu sınırların işlemleri ve toplu yazmaları nasıl etkilediğine ilişkin ayrıntılı bir açıklama için atomik işlemlerin güvenliğini sağlamaya yönelik kılavuza bakın.

Aramalara ve fiyatlandırmaya erişin

Bu işlevlerin kullanılması, veritabanınızda bir okuma işlemi gerçekleştirir; bu, kurallarınız isteği reddetse bile belgeleri okumak için faturalandırılacağınız anlamına gelir. Daha ayrıntılı 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şlevlerdeki koşul kümelerini sarmak isteyebilirsiniz. Güvenlik kuralları özel işlevleri destekler. Özel işlevlerin sözdizimi biraz JavaScript'e benzer, 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. Herhangi bir ek mantık içeremezler. Örneğin, döngü yürütemezler veya harici hizmetleri çağıramazlar.
  • Fonksiyonlar, tanımlandıkları kapsamdaki fonksiyonlara ve değişkenlere otomatik olarak erişebilir. Örneğin, service cloud.firestore kapsamında tanımlanan bir işlevin resource değişkenine ve get() ve service cloud.firestore get() gibi yerleşik işlevlere erişimi exists() .
  • Fonksiyonlar diğer fonksiyonları çağırabilir ancak tekrarlamayabilir. Toplam çağrı yığını derinliği 10 ile sınırlıdır.
  • Kurallar sürüm v2 işlevler, let anahtar sözcüğünü kullanarak değişkenleri tanımlayabilir. İşlevlerin en fazla 10 let bağlaması olabilir, ancak bir return ifadesi ile bitmelidir.

Bir işlev, function anahtar sözcüğüyle tanımlanır ve sıfır veya daha fazla argüman 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ızda 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 güven altına alıp sorgu yazmaya başladığınızda, güvenlik kurallarının filtre olmadığını unutmayın. Bir koleksiyondaki tüm belgeler için bir 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ı alı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 Verilen : where("visibility", "==", "public") yan tümcesi, sonuç kümesinin kuralın koşulunu karşılamasını garanti ettiğinden, bu kural aşağıdaki sorguya izin verir:

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 olası sonucuna göre değerlendirir ve istemcinin okuma iznine sahip olmadığı bir belge döndürebilirse 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 verileri güvenli bir şekilde sorgulama konusuna bakın.

Sonraki adımlar