Cloud Firestore Güvenlik Kurallarını Yapılandırma

Cloud Firestore Güvenlik Kuralları, belgelere ve koleksiyonlar ekleyebilirsiniz. Esnek kurallar söz dizimi, tüm yazmalardan veritabanının tamamına ve işlemlere kadar her şeyle eşleşen kurallar belirli bir doküman üzerinde.

Bu kılavuzda, güvenlik kurallarının temel söz dizimi ve yapısı açıklanmaktadır. Birleştir güvenlik kuralı koşulları ile bu söz dizimini tam kural setlerini kullanın.

Hizmet ve veritabanı beyanı

Cloud Firestore Güvenlik Kuralları her zaman aşağıdaki bildirimle başlar:

service cloud.firestore {
  match /databases/{database}/documents {
    // ...
  }
}

service cloud.firestore bildirimi, kuralların kapsamını Cloud Firestore güvenlik kuralları ile Cloud Firestore güvenlik kuralları arasındaki çakışmaları önleyen diğer ürünler için geçerli kuralları da içerir.

match /databases/{database}/documents bildirimi, kuralların şu şekilde olması gerektiğini belirtir: projedeki herhangi bir Cloud Firestore veri tabanıyla eşleşmelidir. Şu anda her bir proje (default) adında yalnızca tek bir veritabanı var.

Temel okuma/yazma kuralları

Temel kurallar, bir belge yolunu belirten ve bir belge yolunu belirten bir match belirtilen veriler okunurken ayrıntı veren bir allow ifadesine izin verilir:

service cloud.firestore {
  match /databases/{database}/documents {

    // Match any document in the 'cities' collection
    match /cities/{city} {
      allow read: if <condition>;
      allow write: if <condition>;
    }
  }
}

Tüm eşleşme ifadeleri koleksiyonları değil, dokümanları işaret etmelidir. Maç ifadesi, match /cities/SF ürününde olduğu gibi belirli bir dokümana işaret edebilir veya joker karakterler kullanabilir belirtilen yoldaki herhangi bir dokümana işaret etmesini sağlar (ör. match /cities/{city}).

Yukarıdaki örnekte, eşleşme ifadesinde {city} joker karakter söz dizimi kullanılır. Bu, kuralın cities koleksiyonundaki tüm dokümanlar için geçerli olduğu anlamına gelir: /cities/SF veya /cities/NYC. Eşleşme ifadesindeki allow ifadeleri city değişkeni şehir dokümanının adına, SF veya NYC gibi.

Ayrıntılı işlemler

Bazı durumlarda, read ve write metriklerini daha küçük gruplara ayırmak yararlı olur ayrıntılı işlemlerdir. Örneğin, uygulamanız farklı daha fazla koşula uygun düşebilir. Dilerseniz tek belge okumalarına izin verir ancak büyük sorguları reddeder.

read kuralı get ve list özelliklerine ayrılabilirken write kuralı şunları yapabilir: create, update ve delete olarak ayrılmalıdır:

service cloud.firestore {
  match /databases/{database}/documents {
    // A read rule can be divided into get and list rules
    match /cities/{city} {
      // Applies to single document read requests
      allow get: if <condition>;

      // Applies to queries and collection read requests
      allow list: if <condition>;
    }

    // A write rule can be divided into create, update, and delete rules
    match /cities/{city} {
      // Applies to writes to nonexistent documents
      allow create: if <condition>;

      // Applies to writes to existing documents
      allow update: if <condition>;

      // Applies to delete operations
      allow delete: if <condition>;
    }
  }
}

Hiyerarşik veriler

Cloud Firestore'daki veriler belge koleksiyonları halinde düzenlenir ve her bir hiyerarşiyi alt koleksiyonlar aracılığıyla genişletebilir. Bu nedenle, ve güvenlik kurallarının hiyerarşik verilerle nasıl etkileşime girdiğini anlamanızı sağlar.

cities koleksiyonundaki her dokümanın bir landmarks alt koleksiyon. Güvenlik kuralları yalnızca eşleşen yolda geçerli olduğundan cities koleksiyonunda tanımlanan erişim denetimleri landmarks alt koleksiyon. Bunun yerine, erişimi kontrol etmek için açık kurallar yazın alt koleksiyonlara:

service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city} {
      allow read, write: if <condition>;

        // Explicitly define rules for the 'landmarks' subcollection
        match /landmarks/{landmark} {
          allow read, write: if <condition>;
        }
    }
  }
}

match ifadelerini iç içe yerleştirirken iç match ifadesinin yolu her zaman dış match ifadesinin yolu ile göreceli olarak. Aşağıdaki kural kümeleri dolayısıyla eşdeğerdir:

service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city} {
      match /landmarks/{landmark} {
        allow read, write: if <condition>;
      }
    }
  }
}
service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city}/landmarks/{landmark} {
      allow read, write: if <condition>;
    }
  }
}

Yinelemeli joker karakterler

Kuralların rastgele derin bir hiyerarşiye uygulanmasını istiyorsanız yinelemeli joker karakter söz dizimi, {name=**}. Örneğin:

service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the cities collection as well as any document
    // in a subcollection.
    match /cities/{document=**} {
      allow read, write: if <condition>;
    }
  }
}

Yinelemeli joker karakter söz dizimini kullanırken joker karakter değişkeni, Doküman derin bir şekilde iç içe yerleştirilmiş bir koleksiyonda bulunsa bile, eşleşen yol segmentinin tamamı alt koleksiyon oluşturun. Örneğin, yukarıda listelenen kurallar /cities/SF/landmarks/coit_tower adresinde bulunan bir doküman ve document değişkeni SF/landmarks/coit_tower olur.

Bununla birlikte, yinelemeli joker karakterlerin davranışının kurallara bağlı olduğunu unutmayın sürümünü değil.

Sürüm 1

Güvenlik kuralları varsayılan olarak sürüm 1'i kullanır. Sürüm 1'de, yinelemeli joker karakterler bir veya daha fazla yol öğesiyle eşleşiyor. Boş bir yolla eşleşmezler, bu nedenle match /cities/{city}/{document=**}, alt koleksiyonlardaki dokümanlarla eşleşir, ancak cities koleksiyonunda yok, ancak match /cities/{document=**} eşleşiyor Hem cities koleksiyonundaki hem de alt koleksiyonlardaki dokümanlar.

Yinelemeli joker karakterler, eşleşme ifadesinin sonuna gelmelidir.

Sürüm 2

Güvenlik kurallarının 2. sürümünde, yinelemeli joker karakterler sıfır veya daha fazla yolla eşleşiyor öğeler. match/cities/{city}/{document=**}, herhangi bir dokümandaki dokümanlarla eşleşir alt koleksiyonlar ve cities koleksiyonundaki dokümanlar.

URL'nin üstüne rules_version = '2'; ekleyerek sürüm 2'ye dahil olmanız gerekir güvenlik kurallarınız:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the cities collection as well as any document
    // in a subcollection.
    match /cities/{city}/{document=**} {
      allow read, write: if <condition>;
    }
  }
}

Eşleşme ifadesi başına en fazla bir yinelemeli joker karakteriniz olabilir, ancak sürüm 2. Bu joker karakteri, eşleşme ifadesinde herhangi bir yere yerleştirebilirsiniz. Örneğin:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the songs collection group
    match /{path=**}/songs/{song} {
      allow read, write: if <condition>;
    }
  }
}

Koleksiyon grubu sorgularını kullanıyorsanız 2. sürüm için Koleksiyon grubu sorgularının güvenliğini sağlama başlıklı makaleyi inceleyin.

Çakışan eşleşme ifadeleri

Bir doküman birden fazla match ifadesiyle eşleşebilir. birden fazla allow ifadesinin bir istekle eşleştiği durumda, erişime izin verilir koşullardan herhangi biri true ise:

service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the 'cities' collection.
    match /cities/{city} {
      allow read, write: if false;
    }

    // Matches any document in the 'cities' collection or subcollections.
    match /cities/{document=**} {
      allow read, write: if true;
    }
  }
}

Yukarıdaki örnekte, cities koleksiyonundaki tüm okuma ve yazma işlemleri ilk kural olsa bile ikinci kural her zaman true olduğu için izin verilir kural her zaman false şeklindedir.

Güvenlik kuralı sınırları

Güvenlik kurallarıyla çalışırken aşağıdaki sınırlara dikkat edin:

Sınır Ayrıntılar
İstek başına maksimum exists(), get() ve getAfter() çağrısı sayısı
  • Tek belgeli istekler ve sorgu istekleri için 10.
  • Çok belgeli okumalar, işlemler ve toplu yazmalar için 20. Her işlemde yukarıdaki 10 sınırı da geçerlidir.

    3 yazma işlemiyle bir toplu yazma isteği oluşturduğunuzu ve güvenlik kurallarınızın her yazma işlemini doğrulamak için 2 belge erişimi çağrısı kullandığını varsayalım. Bu durumda her yazma işlemi 10 erişim çağrısından 2'sini; toplu yazma isteği ise 20 erişim çağrısından 6'sını kullanır.

Her iki sınırın da aşılması, "izin verilmedi" hatasıyla sonuçlanır.

Bazı belge erişimi çağrıları önbelleğe alınabilir. Önbelleğe alınan çağrılar sınırlamaya dahil edilmez.

Maksimum iç içe yerleştirilen match ifadesi derinliği 10
Yol segmentlerinde, iç içe yerleştirilmiş bir grup match ifadesinde izin verilen maksimum yol uzunluğu 100
İç içe yerleştirilen bir grup match ifadesinde izin verilen maksimum yol yakalama değişkeni sayısı 20
Maksimum işlev çağrısı derinliği 20
Maksimum işlev bağımsız değişkeni sayısı 7
İşlev başına maksimum let işlev bağlama sayısı 10
Maksimum yinelenen veya döngüsel işlev çağrısı sayısı 0 &lpar;izin verilmez&rpar;
İstek başına değerlendirilen maksimum ifade sayısı 1.000
Maksimum kural grubu boyutu Kural kümeleri iki boyut sınırına uymalıdır:
  • Kural grubu metin kaynağının boyutu için 256 KB sınır Firebase konsolundan veya CLI'dan yayınlanan bir firebase deploy
  • Oluşturulan derlenmiş kural grubunun boyutu için 250 KB sınır Firebase'in kaynağı işlediğinde ve arka uç sağlar.

Sonraki adımlar