Güvenlik Kuralları ve Firebase Authentication

Firebase Security Rules, aşağıdakileri destekleyen bir biçimde erişim denetimi ve veri doğrulama sağlar: karmaşıklık seviyesidir. Kullanıcı ve rol tabanlı erişim sistemleri oluşturmak için ve marka gibi görünen Firebase Authentication'ı şununla kullanın: Firebase Security Rules.

Kullanıcıları tanımlama

Authentication, verilerinize erişmek isteyen kullanıcıları tanımlar ve bunun için kurallarınızda kullanabileceğiniz bir değişken olarak görüntüleyebilirsiniz. auth değişkeni şu bilgileri içerir:

  • uid: İstekte bulunan kullanıcıya atanan benzersiz kullanıcı kimliği.
  • token: Authentication tarafından toplanan değerlerin haritası.

auth.token değişkeni aşağıdaki değerleri içerir:

Alan Açıklama
email Hesapla ilişkili e-posta adresi (varsa).
email_verified Kullanıcı, email adresine erişimi olduğunu doğruladıysa true. Bazı sağlayıcılar, sahip oldukları e-posta adreslerini otomatik olarak doğrular.
phone_number Varsa, hesapla ilişkili telefon numarası.
name Ayarlanmışsa, kullanıcının görünen adı.
sub Kullanıcının Firebase UID'si. Bu, proje içinde benzersizdir.
firebase.identities Bu kullanıcının hesabıyla ilişkili tüm kimliklerin sözlüğü. Sözlük anahtarları şunlardan herhangi biri olabilir: email, phone, google.com, facebook.com, github.com, twitter.com. Sözlüğün değerleri, hesapla ilişkilendirilen her kimlik sağlayıcıya ait benzersiz tanımlayıcı dizileridir. Örneğin, auth.token.firebase.identities["google.com"][0], hesapla ilişkilendirilen ilk Google kullanıcı kimliğini içerir.
firebase.sign_in_provider Bu jetonu almak için kullanılan oturum açma sağlayıcısı. Şu dizelerden biri olabilir: custom, password, phone, anonymous, google.com, facebook.com, github.com, twitter.com.
firebase.tenant Varsa, hesapla ilişkili kiracı kimliği. ör. tenant2-m6tyz

Özelleştirilmiş kimlik doğrulama özellikleri eklemek isterseniz auth.token değişkeni özel hak taleplerini de içerir belirtir.

Erişim isteyen kullanıcı oturum açmamışsa auth değişkeni null olur. Örneğin, okumayı sınırlamak istediğinizde kurallarınızda bu özellikten yararlanabilirsiniz. kimliği doğrulanmış kullanıcılara erişim — auth != null. Ancak genel olarak ve yazma erişimini daha da sınırlandırıyor.

auth değişkeni hakkında daha fazla bilgi için referansa bakın belgeleri Cloud Firestore, Realtime Database ve Cloud Storage

Kurallarda kullanıcı bilgilerinden yararlanın

Pratikte kurallarınızda kimliği doğrulanmış bilgiler kullanmak, kurallarınızı ve esnek hale getirebilirsiniz. Verilere erişimi kullanıcıya göre denetleyebilirsiniz kimliği.

Kurallarınızda, auth değişkenindeki bilgilerin ( isteğinde bulunan kullanıcıya ait bilgiler — isteyeceğiz.

Örneğin, uygulamanız, kullanıcıların sahip olmanız gerekir. Bu senaryoda, her bir anahtar kelime için auth.uid değişkeni ve istenen verilerdeki kullanıcı kimliği:

Cloud Firestore

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, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

Realtime Database

{
  "rules": {
    "users": {
      "$userId": {
        // grants write access to the owner of this user account
        // whose uid must exactly match the key ($userId)
        ".write": "$userId === auth.uid"
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  // Only a user can upload their file, but anyone can view it
  match /users/{userId}/{fileName} {
    allow read;
    allow write: if request.auth != null && request.auth.uid == userId;
  }
}

Özel kullanıcı bilgilerini tanımlama

Atanan özel alanları tanımlamak için auth değişkeninden de yararlanabilirsiniz. değer verdiğinizi gösterin.

Örneğin, bir "yönetici" oluşturmak istediğinizi varsayalım yazma erişimi sağlayan rol yolları aranır. Bu özelliği kullanıcılara atardınız ve yollara erişim veren kurallarda bu bilgilerden yararlanabilirsiniz.

Cloud Firestore ürününde kullanıcıların web sayfalarına özel bir alan ekleyebilirsiniz. almak için kurallarınıza yerleştirilmiş bir okumayla bu alanın değerini belirleyin. Bu nedenle, yönetici tabanlı kuralı aşağıdaki örnekteki gibi görünür:

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents/some_collection: {
    // Remember that, in Cloud Firestore, reads embedded in your rules are billed operations
    write: if request.auth != null && get(/databases/(database)/documents/users/$(request.auth.uid)).data.admin == true;
    read: if request.auth != null;
  }
}

Authentication bölgesinde özel hak talepleri oluşturduktan sonra Rules bölümündeki özel hak taleplerine erişebilirsiniz. Ardından bu özel hak taleplerine auth.token değişkenini kullanarak referansta bulunur.

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/$sub_path": {
      // Create a custom claim for the admin role
      ".write": "auth.uid !== null && auth.token.writer === true"
      ".read": "auth.uid !== null"
      }
    }
  }

Cloud Storage

service firebase.storage {
  // Create a custom claim for the admin role
  match /files/{fileName} {
    allow read: if request.auth.uid != null;
    allow write: if request.auth.token.admin == true;
  }
}

Authentication ürününden yararlanan temel Rules ile ilgili daha fazla örnek için bkz. Temel Güvenlik Kuralları.