Temel Güvenlik Kuralları

Firebase Security Rules, depolanan verilerinize erişimi kontrol etmenize olanak tanır. Esnek kurallar söz dizimi, tüm yazmalardan web sitenize kadar her şeyle eşleşen veritabanının tamamını belirli bir belgedeki işlemlere dönüştürün.

Bu kılavuzda, isteyebileceğiniz daha temel kullanım örneklerinden bazıları ve verilerinizin güvenliğini sağlama konusunda daha fazla şekilde bilgilendirilmeniz gerekir. Ancak bundan önce kuralları yazmaya başladığınızda, nasıl işlediğiyle ilgili dil ve davranış.

Kurallarınıza erişmek ve kuralları güncellemek için şurada belirtilen adımları uygulayın: Firebase Security Rules hizmetini yönetin ve dağıtın.

Varsayılan kurallar: Kilitli mod

Firebase konsolunda bir veritabanı veya depolama örneği oluşturduğunuzda Firebase Security Rules cihazınızın verilerinize erişimi kısıtlayıp kısıtlamayacağını seçebilirsiniz (Kilitli mod) veya herkesin erişimine izin verin (Test modu). Cloud Firestore içinde ve Kilitli mod'un varsayılan kuralları olan Realtime Database, tüm kullanıcıların erişimine izin vermez. Cloud Storage ürününde yalnızca kimliği doğrulanmış kullanıcılar depolama alanı paketlerine erişebilir.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Realtime Database

{
  "rules": {
    ".read": false,
    ".write": false
  }
}

Cloud Storage

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Geliştirme ortamı kuralları

Uygulamanız üzerinde çalışırken nispeten açık veya sabit olmak isteyebilirsiniz. verilerinize erişebilirsiniz. Öncesinde Rules güncellediğinizden emin olun. uygulamanızı üretime dağıtmanıza yardımcı olur. Ayrıca uygulamanızı dağıttığınızda lansmanı yapmamış olsanız bile herkesin erişimine açıktır.

Firebase'in, müşterilerin verilerinize doğrudan erişmesine olanak sağladığını ve Kötü amaçlı kullanıcılar için erişimi engelleyen tek teminat Firebase Security Rules. Tanımlama kuralları, ürün mantığından ayrı olarak birçok avantaj sağlar: sağlamaktan sorumluysa, hatalı uygulamalar ve en önemlisi, aracı bir ara sunucuya korumanın yolları geliyordu.

Tüm kimliği doğrulanmış kullanıcılar

Verilerinizi yalnızca yetkili olan ve oturum açmış durumdayken, kimliği doğrulanmış herhangi bir kullanıcıya erişimi en iyi uygulamadır.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Realtime Database

{
  "rules": {
    ".read": "auth.uid !== null",
    ".write": "auth.uid !== null"
  }
}

Cloud Storage

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Üretime hazır kurallar

Uygulamanızı dağıtmaya hazırlanırken verilerinizin korunmasını ve gerektiği gibi verilmesi gerekir. Yararlanın Kullanıcı tabanlı erişim ayarlamak ve doğrudan okuma yapmak için Authentication veritabanından farklı bir ayar sunar.

Verilerinizi yapılandırırken kurallar yazmayı düşünün kurallarınızı ayarlamanız, farklı yerlerde verilere erişimi kısıtlama şeklinizi etkiler yollar.

Yalnızca içerik sahibi erişimi

Bu kurallar, erişimi yalnızca içeriğin kimliği doğrulanmış sahibiyle kısıtlar. İlgili içeriği oluşturmak için kullanılan veriler yalnızca tek bir kullanıcı tarafından okunabilir ve yazılabilir durumdadır ve veri yolu kullanıcı kimliği.

Bu kural ne zaman çalışır? Veriler kullanıcı tarafından birbirinden ayrılıyorsa (örneğin, Verilere erişmesi gereken tek kullanıcı, dışı verilerdir.

Bu kural çalışmadığında: Birden fazla kullanıcı olduğunda bu kural grubu çalışmaz aynı verileri yazması veya okuması gerekir. Kullanıcılar verilerin üzerine yazar veya ve oluşturdukları verilere erişmek istiyor.

Bu kuralı oluşturmak için: Erişim isteyen kullanıcıyı onaylayan bir kural oluşturun veri okuma veya yazma yetkisi, o verilerin sahibi olan kişidir.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{userId}/{documents=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId
    }
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      "$uid": {
        // Allow only authenticated content owners access to their data
        ".read": "auth !== null && auth.uid === $uid",
        ".write": "auth !== null && auth.uid === $uid"
      }
    }
  }
}

Cloud Storage

// Grants a user access to a node matching their user ID
service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

Karma herkese açık ve özel erişim

Bu kural herkesin bir veri kümesini okumasına izin verir ancak yalnızca kimliği doğrulanmış içerik sahibine yönelik belirli bir yoldaki verileri oluşturamaz veya değiştiremezsiniz.

Bu kural ne zaman çalışır? Bu kural, herkese açık olarak kullanılmasını gerektiren uygulamalar için uygundur ancak bu öğelere düzenleme erişimini kısıtlaması gerekiyorsa sahip olanlar. Örneğin, bir sohbet uygulaması veya blog.

Bu kural çalışmadığında: "Yalnızca içerik sahibi" kuralı gibi bu kural grubu da birden çok kullanıcının aynı verileri düzenlemesi gerektiğinde çalışmaz. Kullanıcılar birbirinin verilerinin üzerine yazar.

Bu kuralı ayarlamak için: Tüm kullanıcılar için okuma erişimi sağlayan bir kural oluşturun (veya kimliği doğrulanan tüm kullanıcılar) kontrol ederek veri yazan kullanıcının veri sahibi olduğunu onaylar.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow create: if request.auth.uid == request.resource.data.author_uid;
      allow update, delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}

Realtime Database

{
// Allow anyone to read data, but only authenticated content owners can
// make changes to their data

  "rules": {
    "some_path": {
      "$uid": {
        ".read": true,
        // or ".read": "auth.uid !== null" for only authenticated users
        ".write": "auth.uid === $uid"
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read;
      allow write: if request.auth.uid == userId;
    }
  }
}

Özellik ve rol tabanlı erişim

Bu kuralın çalışması için dışı verilerdir. Firebase Security Rules, isteği veritabanınızdaki veya dosyanızdaki verilerle karşılaştırarak kontrol eder. meta verileri kullanır.

Bu kural çalıştığında: Kullanıcılara bir rol atıyorsanız bu kural rollere veya belirli kullanıcı gruplarına göre erişimi kolayca sınırlandırabilirsiniz. Örneğin, notları depoladıysanız, notları farklı erişim düzeyleri ile "öğrenciler" grubu (yalnızca içeriklerini okuma), "öğretmenler" grup (konularında okuma ve yazma) ve "ana hesap" gibi grup (tüm içeriği oku).

Bu kural çalışmadığında: Realtime Database ve Cloud Storage için kurallarınız Cloud Firestore kurallarının uygulayabileceği get() yönteminden yararlanılamıyor. Sonuç olarak, veritabanınızı veya dosya meta verilerinizi özellikleri tanımlıyor.

Bu kuralı oluşturmak için: Cloud Firestore dosyasında, kullanıcılarınızın okuyabilmeniz ve ardından kuralınızı bu dosyayı okuyacak şekilde alanına giriş yapıp koşullu olarak erişim izni verebilirsiniz. Realtime Database ürününde, şu özelliklere sahip bir veri yolu oluşturun: Uygulamanızın kullanıcılarını tanımlar ve onlara bir alt düğümde rol verir.

Ayrıca Authentication sayfasında özel hak talepleri oluşturabilirsiniz. ve daha sonra bu bilgileri Herhangi bir Firebase Security Rules içindeki auth.token değişkeni.

Veri tanımlı özellikler ve roller

Bu kurallar yalnızca Cloud Firestore ve Realtime Database ile çalışır.

Cloud Firestore

Kurallarınız aşağıdaki kurallar gibi bir okuma içerdiğinde, Cloud Firestore bölgesinde bir okuma işlemi için faturalandırılıyorsunuz.

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, Check a boolean `admin` attribute
    allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"
   }
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      "${subpath}": {
        //
        ".write": "root.child('users').child(auth.uid).child('role').val() === 'admin'",
        ".read": true
      }
    }
  }
}

Özel hak talebi özellikleri ve rolleri

Bu kuralları uygulamak için özel hak talepleri oluşturun Firebase Authentication seçeneğini belirleyin ve ardından kurallarınızdaki hak taleplerinden yararlanın.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, check for an admin claim
    allow write: if request.auth.token.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if request.auth.token.reader == "true";
     allow write: if request.auth.token.writer == "true";
   }
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      "$uid": {
        // Create a custom claim for each role or group
        // you want to leverage
        ".write": "auth.uid !== null && auth.token.writer === true",
        ".read": "auth.uid !== null && auth.token.reader === true"
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  // Allow reads if the group ID in your token matches the file metadata's `owner` property
  // Allow writes if the group ID is in the user's custom token
  match /files/{groupId}/{fileName} {
    allow read: if resource.metadata.owner == request.auth.token.groupId;
    allow write: if request.auth.token.groupId == groupId;
  }
}

Kiracı özellikleri

Bu kuralları uygulamak için Google Cloud Identity Platform'da (GCIP) çok kiracılı yapı ayarlarını yapın ve kurallarınızda kiracıdan yararlanın. Aşağıdaki örneklerde yazma işlemine izin verilir belirli bir kiracıdaki bir kullanıcıdan tenant2-m6tyz.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // For tenant-based access control, check for a tenantID
    allow write: if request.auth.token.firebase.tenant == 'tenant2-m6tyz';
    allow read: true;
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      "$uid": {
        // Only allow reads and writes if user belongs to a specific tenant
        ".write": "auth.uid !== null && auth.token.firebase.tenant === 'tenant2-m6tyz'",
        ".read": "auth.uid !== null
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  // Only allow reads and writes if user belongs to a specific tenant
  match /files/{tenantId}/{fileName} {
    allow read: if request.auth != null;
    allow write: if request.auth.token.firebase.tenant == tenantId;
  }
}