了解 2023 年 Google I/O 大会上介绍的 Firebase 亮点。了解详情

Temel Güvenlik Kuralları

Firebase Güvenlik Kuralları, saklanan verilerinize erişimi kontrol etmenizi sağlar. Esnek kural sözdizimi, tüm yazma işlemlerinden tüm veritabanına ve belirli bir belge üzerindeki işlemlere kadar her şeyle eşleşen kurallar oluşturabileceğiniz anlamına gelir.

Bu kılavuz, uygulamanızı kurarken ve verilerinizi korurken uygulamak isteyebileceğiniz daha temel kullanım örneklerinden bazılarını açıklamaktadır. Ancak kuralları yazmaya başlamadan önce, kuralların yazıldığı dil ve davranışları hakkında daha fazla bilgi edinmek isteyebilirsiniz.

Kurallarınıza erişmek ve bunları güncellemek için Firebase Güvenlik Kurallarını Yönetme ve dağıtma bölümünde belirtilen adımları izleyin.

Varsayılan kurallar: Kilitli mod

Firebase konsolunda bir veritabanı veya depolama örneği oluşturduğunuzda, Firebase Güvenlik Kurallarınızın verilerinize erişimi kısıtlamasını ( Kilitli mod ) veya herhangi birinin erişmesine izin vermesini ( Test modu ) seçersiniz. Cloud Firestore ve Realtime Database'de, Kilitli mod için varsayılan kurallar tüm kullanıcıların erişimini engeller. Cloud Storage'da, yalnızca kimliği doğrulanmış kullanıcılar depolama paketlerine erişebilir.

Bulut Firestore

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

Gerçek Zamanlı Veritabanı

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

Bulut depolama

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, verilerinize nispeten açık veya sınırsız erişim isteyebilirsiniz. Uygulamanızı üretime dağıtmadan önce Kurallarınızı güncellediğinizden emin olun. Ayrıca, uygulamanızı dağıtırsanız, siz başlatmamış olsanız bile herkesin erişimine açık olduğunu unutmayın.

Firebase'in istemcilerin verilerinize doğrudan erişmesine izin verdiğini ve kötü niyetli kullanıcıların erişimini engelleyen tek korumanın Firebase Güvenlik Kuralları olduğunu unutmayın. Kuralları ürün mantığından ayrı olarak tanımlamanın bir dizi avantajı vardır: istemciler güvenliği uygulamaktan sorumlu değildir, hatalı uygulamalar verilerinizi tehlikeye atmaz ve en önemlisi, verileri dünyadan korumak için bir aracı sunucuya güvenmezsiniz.

Kimliği doğrulanmış tüm kullanıcılar

Verilerinizi oturum açmış olan herhangi bir kullanıcının erişimine açmanızı önermesek de, uygulamanızı geliştirirken kimliği doğrulanmış herhangi bir kullanıcıya erişimi ayarlamak yararlı olabilir.

Bulut Firestore

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

Gerçek Zamanlı Veritabanı

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

Bulut depolama

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 korunduğundan ve bu erişimin kullanıcılarınıza uygun şekilde verildiğinden emin olun. Kullanıcı tabanlı erişim kurmak için Kimlik Doğrulama'dan yararlanın ve veri tabanlı erişim kurmak için doğrudan veritabanınızdan okuyun.

Verilerinizi yapılandırırken kurallar yazmayı düşünün, çünkü kurallarınızı oluşturma şekliniz, farklı yollardaki verilere erişimi nasıl kısıtlayacağınızı etkiler.

Yalnızca içerik sahibi erişimi

Bu kurallar, yalnızca içeriğin kimliği doğrulanmış sahibine erişimi kısıtlar. Veriler yalnızca bir kullanıcı tarafından okunabilir ve yazılabilir ve veri yolu, kullanıcının kimliğini içerir.

Bu kural çalıştığında: Bu kural, veriler kullanıcı tarafından silolanırsa - verilere erişmesi gereken tek kullanıcı, verileri oluşturan kullanıcıysa iyi çalışır.

Bu kural çalışmadığında: Bu kural seti, birden çok kullanıcının aynı verileri yazması veya okuması gerektiğinde çalışmaz; kullanıcılar verilerin üzerine yazar veya oluşturdukları verilere erişemez.

Bu kuralı ayarlamak için: Verileri okumak veya yazmak için erişim talep eden kullanıcının bu verilerin sahibi olduğunu onaylayan bir kural oluşturun.

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

Gerçek Zamanlı Veritabanı

{
  "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"
      }
    }
  }
}

Bulut depolama

// 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 genel ve özel erişim

Bu kural, herkesin bir veri kümesini okumasına izin verir, ancak belirli bir yolda veri oluşturma veya değiştirme yeteneğini yalnızca kimliği doğrulanmış içerik sahibiyle sınırlar.

Bu kural çalıştığında: Bu kural, genel olarak okunabilir öğeler gerektiren ancak düzenleme erişimini bu öğelerin sahipleriyle kısıtlaması gereken uygulamalar için iyi çalışır. Örneğin, bir sohbet uygulaması veya blog.

Bu kural çalışmadığında: Yalnızca içerik sahibi kuralı gibi, bu kural seti birden çok kullanıcının aynı verileri düzenlemesi gerektiğinde çalışmaz. Kullanıcılar sonuçta birbirlerinin verilerinin üzerine yazacaktır.

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

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

Gerçek Zamanlı Veritabanı

{
// 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"
      }
    }
  }
}

Bulut depolama

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

Nitelik tabanlı ve Rol tabanlı erişim

Bu kuralların çalışması için, verilerinizdeki kullanıcılara öznitelikler tanımlamanız ve atamanız gerekir. Firebase Güvenlik Kuralları, erişimi onaylamak veya reddetmek için talebi veritabanınızdaki verilerle veya dosyanın meta verileriyle karşılaştırır.

Bu kural ne zaman çalışır: Kullanıcılara bir rol atıyorsanız, bu kural erişimi rollere veya belirli kullanıcı gruplarına göre sınırlamayı kolaylaştırır. Örneğin, notları saklıyorsanız, "öğrenciler" grubuna (yalnızca içeriklerini okuyun), "öğretmenler" grubuna (konularında okuma ve yazma) ve "müdürler" grubuna (okuma) farklı erişim düzeyleri atayabilirsiniz. tüm içerik).

Bu kural çalışmadığında: Realtime Database ve Cloud Storage'da kurallarınız, Cloud Firestore kurallarının dahil edebileceği get() yönteminden yararlanamaz. Sonuç olarak, veritabanınızı veya dosya meta verilerinizi kurallarınızda kullandığınız öznitelikleri yansıtacak şekilde yapılandırmanız gerekir.

Bu kuralı ayarlamak için: Cloud Firestore'da, kullanıcılarınızın belgelerine okuyabileceğiniz bir alan ekleyin, ardından kuralınızı bu alanı okuyacak şekilde yapılandırın ve koşullu olarak erişim verin. Gerçek Zamanlı Veritabanında, uygulamanızın kullanıcılarını tanımlayan ve onlara bir alt düğümde rol veren bir veri yolu oluşturun.

Ayrıca Kimlik Doğrulama'da özel talepler ayarlayabilir ve ardından bu bilgileri herhangi bir Firebase Güvenlik Kuralındaki auth.token değişkeninden alabilirsiniz.

Veri tanımlı nitelikler ve roller

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

Bulut Firestore

Aşağıdaki kurallar gibi kurallarınız bir okuma içerdiğinde, Cloud Firestore'da bir okuma işlemi için faturalandırıldığınızı unutmayın.

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

Gerçek Zamanlı Veritabanı

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

Özel talep öznitelikleri ve rolleri

Bu kuralları uygulamak için Firebase Authentication'da özel talepler oluşturun ve ardından kurallarınızdaki taleplerden yararlanın.

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

Gerçek Zamanlı Veritabanı

{
  "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"
      }
    }
  }
}

Bulut depolama

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ılık özellikleri

Bu kuralları uygulamak için Google Cloud Identity Platform'da (GCIP) çoklu kiracılık kurun ve ardından kurallarınızda kiracıdan yararlanın. Aşağıdaki örnekler, belirli bir kiracıdaki bir kullanıcıdan yazma işlemlerine izin verir, örneğin tenant2-m6tyz

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

Gerçek Zamanlı Veritabanı

{
  "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
      }
    }
  }
}

Bulut depolama

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