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