Firebase Security Rules birden fazla karmaşıklık düzeyini destekleyen bir biçimde erişim kontrolü ve veri doğrulama sağlar. Kullanıcılarınızın verilerini güvende tutan kullanıcı tabanlı ve role dayalı erişim sistemleri oluşturmak için Firebase Security Rules ile birlikte Firebase Authentication'yi kullanın.
Kullanıcıları tanımlama
Authentication, verilerinize erişim isteyen kullanıcıları tanımlar ve bu bilgileri kurallarınızda kullanabileceğiniz bir değişken olarak sağlar. auth
değişkeni aşağıdaki 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 |
Hesapla ilişkili telefon numarası (varsa). |
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ı hesabıyla ilişkili tüm kimliklerin sözlüğü. Sözlüğün anahtarları şunlardan biri olabilir: email , phone , google.com , facebook.com , github.com , twitter.com . Sözlüğün değerleri, hesapla ilişkili her kimlik sağlayıcı için benzersiz tanımlayıcı dizileridir. Örneğin, auth.token.firebase.identities["google.com"][0] , hesapla ilişkili ilk Google kullanıcı kimliğini içerir. |
firebase.sign_in_provider |
Bu jetonu almak için kullanılan oturum açma hizmet sağlayıcısı. Şu dizelerden biri olabilir: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com . |
firebase.tenant |
Hesapla ilişkili tenantId (varsa). Örneğin: tenant2-m6tyz |
Özelleştirilmiş kimlik doğrulama özellikleri eklemek istiyorsanız auth.token
değişkeni, belirttiğiniz tüm özel talepleri
de içerir.
Erişim isteyen kullanıcı oturum açmadığında auth
değişkeni null
olur.
Örneğin, okuma erişimini kimliği doğrulanmış kullanıcılarla sınırlamak istiyorsanız kurallarınızda bu özellikten yararlanabilirsiniz. auth != null
Ancak genellikle yazma erişimini daha da kısıtlamanızı öneririz.
auth
değişkeni hakkında daha fazla bilgi için Cloud Firestore, Realtime Database ve Cloud Storage ile ilgili referans belgelerine bakın.
Kurallarda kullanıcı bilgilerinden yararlanma
Uygulamada, kurallarınızda kimliği doğrulanmış bilgileri kullanmak kurallarınızı daha güçlü ve esnek hale getirir. Verilere erişimi kullanıcı kimliğine göre kontrol edebilirsiniz.
Kurallarınızda, auth
değişkenindeki bilgilerin (istekte bulunanın kullanıcı bilgileri) istenen verilerle ilişkili kullanıcı bilgileriyle nasıl eşleştiğini tanımlayın.
Örneğin, uygulamanız kullanıcıların yalnızca kendi verilerini okuyup yazabilmesini sağlamak isteyebilir. Bu senaryoda, auth.uid
değişkeni ile istenen verilerdeki kullanıcı kimliği arasında eşleşme olmasını istersiniz:
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ı bilgileri tanımlama
Uygulamanızın kullanıcılarına atanan özel alanları tanımlamak için auth
değişkeninden daha fazla yararlanabilirsiniz.
Örneğin, belirli yollarda yazma erişimini etkinleştiren bir "yönetici" rolü oluşturmak istediğinizi varsayalım. Bu özelliği kullanıcılara atar ve ardından yollara erişim izni veren kurallarda kullanırsınız.
Cloud Firestore içinde, kullanıcıların dokümanlarına özel bir alan ekleyebilir ve kurallarınıza yerleştirilmiş bir okuma işlemiyle bu alanın değerini alabilirsiniz. Bu nedenle, yönetici tabanlı kuralınız 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'de özel talepler oluşturduktan sonra Rules'da özel taleplere erişebilirsiniz. Daha sonra auth.token
değişkenini kullanarak bu özel taleplere referans verebilirsiniz.
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;
}
}
Rules ile Authentication'nin kullanıldığı daha fazla temel örnek için Temel Güvenlik Kuralları başlıklı makaleyi inceleyin.