Firebase, Kurallarınızı yönetmeniz için her biri belirli durumlarda yararlı olan ve her biri aynı arka uç Firebase Güvenlik Kuralları yönetim API'sini kullanan çeşitli araçlar sağlar.
Çağırmak için hangi araç kullanılırsa kullanılsın, yönetim API'si:
- Bir Kural kaynağı alır : bir kural kümesi, genellikle Firebase Güvenlik Kuralları deyimlerini içeren bir kod dosyası.
- Alınan kaynağı değişmez bir kural kümesi olarak depolar.
- Bir sürümdeki her kural kümesinin dağıtımını izler. Firebase Güvenlik Kuralları'nın etkin olduğu hizmetler, güvenli bir kaynak için her isteği değerlendirmek üzere bir projenin yayınını arar.
- Bir kural kümesinin sözdizimsel ve anlamsal testlerini çalıştırma yeteneği sağlar.
Firebase CLI'yi kullanın
Firebase CLI ile yerel kaynakları yükleyebilir ve sürümleri dağıtabilirsiniz. CLI'nin Firebase Yerel Öykünücü Paketi, kaynakların tam yerel testini gerçekleştirmenize olanak tanır.
CLI'yi kullanmak, uygulama kodunuzla kurallarınızı sürüm kontrolü altında tutmanıza ve mevcut dağıtım sürecinizin bir parçası olarak kuralları dağıtmanıza olanak tanır.
Bir yapılandırma dosyası oluşturun
Firebase projenizi Firebase CLI kullanarak yapılandırdığınızda, proje dizininizde bir .rules
yapılandırma dosyası oluşturursunuz. Firebase projenizi yapılandırmaya başlamak için aşağıdaki komutu kullanın:
Bulut Firestore
// Set up Firestore in your project directory, creates a .rules file firebase init firestore
Gerçek Zamanlı Veritabanı
// Set up Realtime Database in your project directory, creates a .rules file firebase init database
Bulut depolama
// Set up Storage in your project directory, creates a .rules file firebase init storage
Kurallarınızı düzenleyin ve güncelleyin
Kural kaynağınızı doğrudan .rules
yapılandırma dosyasında düzenleyin.
Firebase CLI'de yaptığınız tüm düzenlemelerin Firebase konsoluna yansıtıldığından veya Firebase konsolunu ya da Firebase CLI'yi kullanarak sürekli güncellemeler yaptığınızdan emin olun. Aksi takdirde, Firebase konsolunda yapılan güncellemelerin üzerine yazabilirsiniz.
Güncellemelerinizi test edin
Local Emulator Suite, Güvenlik Kurallarının etkin olduğu tüm ürünler için emülatörler sağlar. Her emülatör için Güvenlik Kuralları motoru, kuralların hem sözdizimsel hem de anlamsal değerlendirmesini gerçekleştirerek Güvenlik Kuralları yönetim API'sinin sunduğu sözdizimsel testi aşar.
CLI ile çalışıyorsanız Suite, Firebase Güvenlik Kuralları testi için mükemmel bir araçtır. Güncellemelerinizi yerel olarak test etmek ve uygulamanızın Kurallarının istediğiniz davranışı sergilediğini doğrulamak için Local Emulator Suite'i kullanın.
Güncellemelerinizi dağıtın
Kurallarınızı güncelleyip test ettikten sonra, kaynakları üretime dağıtın.
Cloud Firestore Güvenlik Kuralları için, firebase.json
dosyanızı gözden geçirip güncelleyerek .rules
dosyalarını varsayılan ve ek adlandırılmış veritabanlarınızla ilişkilendirin.
Kurallarınızı tek başına seçerek dağıtmak veya normal dağıtım sürecinizin bir parçası olarak dağıtmak için aşağıdaki komutları kullanın.
Bulut Firestore
// Deploy rules for all databases configured in your firebase.json firebase deploy --only firestore:rules
// Deploy rules for the specified database configured in your firebase.json firebase deploy --only firestore:<databaseId>
Gerçek Zamanlı Veritabanı
// Deploy your .rules file firebase deploy --only database
Bulut depolama
// Deploy your .rules file firebase deploy --only storage
Firebase konsolunu kullanın
Ayrıca Kural kaynaklarını düzenleyebilir ve bunları Firebase konsolundan yayınlar olarak dağıtabilirsiniz. Sözdizimsel test , siz Firebase konsolu kullanıcı arayüzünde düzenleme yaparken gerçekleştirilir ve anlamsal test, Rules Playground kullanılarak kullanılabilir.
Kurallarınızı düzenleyin ve güncelleyin
- Firebase konsolunu açın ve projenizi seçin.
- Ardından, ürün gezinti alanından Realtime Database , Cloud Firestore veya Storage'ı seçin ve ardından Kurallar düzenleyicisine gitmek için Kurallar'a tıklayın.
- Kurallarınızı doğrudan düzenleyicide düzenleyin.
Güncellemelerinizi test edin
Düzenleyici kullanıcı arabiriminde sözdizimini test etmenin yanı sıra, projenizin veritabanını ve depolama kaynaklarını kullanarak, doğrudan Firebase konsolunda, Rules Playground kullanarak semantik Kurallar davranışını test edebilirsiniz. Kural düzenleyicide Kural Oyun Alanı ekranını açın, ayarları değiştirin ve Çalıştır'a tıklayın. Düzenleyicinin üst kısmındaki onay mesajını arayın.
Güncellemelerinizi dağıtın
Güncellemelerinizin beklediğiniz gibi olduğundan emin olduktan sonra Yayınla 'yı tıklayın.
Yönetici SDK'sını kullanın
Node.js kural kümeleri için Yönetici SDK'sını kullanabilirsiniz. Bu programatik erişimle şunları yapabilirsiniz:
- Kuralları yönetmek için özel araçlar, betikler, panolar ve CI/CD ardışık düzenleri uygulayın.
- Birden çok Firebase projesinde kuralları daha kolay yönetin.
Kuralları programlı olarak güncellerken, uygulamanızın erişim denetiminde istenmeyen değişiklikler yapmaktan kaçınmak çok önemlidir. Özellikle kuralları güncellerken veya dağıtırken, Admin SDK kodunuzu güvenliği en önde tutarak yazın.
Akılda tutulması gereken bir diğer önemli nokta, Firebase Güvenlik Kuralları sürümlerinin tam olarak yayılmasının birkaç dakika sürmesidir. Kuralları dağıtmak için Yönetici SDK'sını kullanırken, uygulamanızın dağıtımı henüz tamamlanmamış kurallara hemen bağlı olduğu yarış koşullarından kaçındığınızdan emin olun. Kullanım durumunuz, erişim denetimi kuralları için sık güncellemeler gerektiriyorsa, sık güncellemelere rağmen yarış koşullarını azaltmak için tasarlanmış Cloud Firestore'u kullanan çözümleri düşünün.
Ayrıca şu sınırlara dikkat edin:
- Kurallar, serileştirildiğinde UTF-8 kodlu metnin 256 KiB'sinden küçük olmalıdır.
- Bir projede toplam dağıtılan en fazla 2500 kural kümesi olabilir. Bu sınıra ulaşıldığında, yenilerini oluşturmadan önce bazı eski kural kümelerini silmeniz gerekir.
Cloud Storage veya Cloud Firestore kural kümeleri oluşturun ve dağıtın
Admin SDK ile güvenlik kurallarını yönetmek için tipik bir iş akışı, üç ayrı adımı içerebilir:
- Bir kural dosyası kaynağı oluşturun (isteğe bağlı)
- Bir kural kümesi oluşturun
- Yeni kural kümesini yayınlayın veya dağıtın
SDK, bu adımları Cloud Storage ve Cloud Firestore güvenlik kuralları için tek bir API çağrısında birleştirmek için bir yöntem sağlar. Örneğin:
const source = `service cloud.firestore {
match /databases/{database}/documents {
match /carts/{cartID} {
allow create: if request.auth != null && request.auth.uid == request.resource.data.ownerUID;
allow read, update, delete: if request.auth != null && request.auth.uid == resource.data.ownerUID;
}
}
}`;
// Alternatively, load rules from a file
// const fs = require('fs');
// const source = fs.readFileSync('path/to/firestore.rules', 'utf8');
await admin.securityRules().releaseFirestoreRulesetFromSource(source);
Aynı kalıp, releaseFirestoreRulesetFromSource()
ile Bulut Depolama kuralları için çalışır.
Alternatif olarak, kurallar dosyasını bir bellek içi nesne olarak oluşturabilir, kural setini oluşturabilir ve bu olayların daha yakından kontrolü için kural setini ayrı olarak konuşlandırabilirsiniz. Örneğin:
const rf = admin.securityRules().createRulesFileFromSource('firestore.rules', source);
const rs = await admin.securityRules().createRuleset(rf);
await admin.securityRules().releaseFirestoreRuleset(rs);
Gerçek Zamanlı Veritabanı kural kümelerini güncelleyin
Realtime Database kural kümelerini Admin SDK ile güncellemek için admin.database
öğesinin getRules()
ve setRules()
yöntemlerini kullanın. Kural kümelerini JSON biçiminde veya yorumların dahil olduğu bir dize olarak alabilirsiniz.
Bir kural setini güncellemek için:
const source = `{
"rules": {
"scores": {
".indexOn": "score",
"$uid": {
".read": "$uid == auth.uid",
".write": "$uid == auth.uid"
}
}
}
}`;
await admin.database().setRules(source);
Kural kümelerini yönet
Admin SDK, büyük kural kümelerini yönetmenize yardımcı olmak için admin.securityRules().listRulesetMetadata
ile mevcut tüm kuralları listelemenizi sağlar. Örneğin:
const allRulesets = [];
let pageToken = null;
while (true) {
const result = await admin.securityRules().listRulesetMetadata(pageToken: pageToken);
allRulesets.push(...result.rulesets);
pageToken = result.nextPageToken;
if (!pageToken) {
break;
}
}
Zamanla 2500 kural kümesi sınırına ulaşan çok büyük dağıtımlar için, sabit bir zaman döngüsünde en eski kuralları silmek için bir mantık oluşturabilirsiniz. Örneğin, 30 günden uzun süre dağıtılan tüm kural kümelerini silmek için:
const thirtyDays = new Date(Date.now() - THIRTY_DAYS_IN_MILLIS);
const promises = [];
allRulesets.forEach((rs) => {
if (new Date(rs.createTime) < thirtyDays) {
promises.push(admin.securityRules().deleteRuleset(rs.name));
}
});
await Promise.all(promises);
console.log(`Deleted ${promises.length} rulesets.`);
REST API'sini kullanın
Yukarıda açıklanan araçlar, projenizdeki birden çok Cloud Firestore veritabanı için Firebase Güvenlik Kuralları yönetimi dahil olmak üzere çeşitli iş akışları için çok uygundur, ancak Firebase Güvenlik Kurallarını yönetim API'sinin kendisini kullanarak yönetmek ve dağıtmak isteyebilirsiniz. Yönetim API'si size en büyük esnekliği sağlar.
Ayrıca şu sınırlara dikkat edin:
- Kurallar, serileştirildiğinde UTF-8 kodlu metnin 256 KiB'sinden küçük olmalıdır.
- Bir projede toplam dağıtılan en fazla 2500 kural kümesi olabilir. Bu sınıra ulaşıldığında, yenilerini oluşturmadan önce bazı eski kural kümelerini silmeniz gerekir.
REST ile Cloud Firestore veya Cloud Storage kural kümeleri oluşturun ve dağıtın
Bu bölümdeki örnekler, Bulut Depolama Kuralları için de geçerli olsalar da Firestore Kurallarını kullanır.
Örnekler ayrıca API çağrıları yapmak için cURL kullanır. Kimlik doğrulama belirteçlerini ayarlama ve geçirme adımları atlanmıştır. Referans belgelerle entegre edilmiş API Gezgini'ni kullanarak bu API ile denemeler yapabilirsiniz.
Yönetim API'sini kullanarak bir kural kümesi oluşturmaya ve dağıtmaya yönelik tipik adımlar şunlardır:
- Kural dosyası kaynakları oluştur
- Bir kural kümesi oluşturun
- Yeni kural kümesini serbest bırakın (dağıtın).
kaynak oluştur
secure_commerce
Firebase projeniz üzerinde çalıştığınızı ve projenizdeki east_store
adlı bir veritabanına kilitli Cloud Firestore Kurallarını dağıtmak istediğinizi varsayalım.
Bu kuralları bir firestore.rules
dosyasında uygulayabilirsiniz.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Bir kural kümesi oluşturun
Şimdi, bu dosya için base64 kodlu bir parmak izi oluşturun. Daha sonra, bu dosyadaki kaynağı, bir kural kümesi oluşturmak için gerekli olan yükü, projects.rulesets.create
REST çağrısıyla doldurmak için kullanabilirsiniz. Burada, firestore.rules
içeriğini REST yüküne eklemek için cat
komutunu kullanın.
İzleme için, bunu east_store
veritabanınızla ilişkilendirmek üzere, attachment_point
east_store
olarak ayarlayın.
curl -X POST -d '{
"source": {
{
"files": [
{
"content": "' $(cat storage.rules) '",
"name": "firestore.rules",
"fingerprint": <sha fingerprint>
},
"attachment_point": "firestore.googleapis.com/databases/east_store"
]
}
}
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets'
API, bir doğrulama yanıtı ve bir kural kümesi adı döndürür; örneğin projects/secure_commerce/rulesets/uuid123
.
Bir kural kümesini serbest bırakın (dağıtın)
Kural seti geçerliyse son adım, yeni kural setini adlandırılmış bir sürümde dağıtmaktır.
curl -X POST -d '{
"name": "projects/secure_commerce/releases/cloud.firestore/east_store" ,
"rulesetName": "projects/secure_commerce/rulesets/uuid123"
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/releases'
Firebase Güvenlik Kuralları sürümlerinin tamamen yayılmasının birkaç dakika sürdüğünü unutmayın. Dağıtım için yönetim REST API'sini kullanırken, uygulamanızın dağıtımı henüz tamamlanmamış kurallara hemen bağlı olduğu yarış koşullarından kaçındığınızdan emin olun.
Gerçek Zamanlı Veritabanı kural kümelerini REST ile güncelleyin
Realtime Database, Kuralları yönetmek için kendi REST arayüzünü sağlar. Bkz . Firebase Gerçek Zamanlı Veritabanı Kurallarını REST Yoluyla Yönetme .
REST ile kural kümelerini yönetin
Yönetim API'si, büyük kural dağıtımlarının yönetilmesine yardımcı olmak için, kural kümeleri ve sürümler oluşturmaya yönelik bir REST yöntemine ek olarak aşağıdakileri yapmak için yöntemler sağlar:
- kural kümelerini listeleme, alma ve silme
- kural yayınlarını listeleme, alma ve silme
Zamanla 2500 kural kümesi sınırına ulaşan çok büyük dağıtımlar için, sabit bir zaman döngüsünde en eski kuralları silmek için bir mantık oluşturabilirsiniz. Örneğin, 30 günden uzun süre dağıtılan tüm kural kümelerini silmek için, projects.rulesets.list
yöntemini çağırabilir, bunların createTime
anahtarlarındaki Ruleset
nesnelerinin JSON listesini ayrıştırabilir ve ardından, ruleset_id
ile karşılık gelen kural kümelerinde project.rulesets.delete
çağırabilirsiniz. .
Güncellemelerinizi REST ile test edin
Son olarak, yönetim API'si, üretim projelerinizdeki Cloud Firestore ve Cloud Storage kaynakları üzerinde sözdizimsel ve anlamsal testler çalıştırmanıza olanak tanır.
API'nin bu bileşeniyle yapılan testler şunlardan oluşur:
- Bir
TestCase
nesnesi grubunu temsil edecek birTestSuite
JSON nesnesi tanımlama -
TestSuite
gönderme - Döndürülen
TestResult
nesnelerini ayrıştırma
Bir testcase.json
dosyasında tek bir TestCase
ile bir TestSuite
nesnesi tanımlayalım. Bu örnekte, bu kurallar üzerinde çalışacak test paketinin yanı sıra Kurallar dili kaynağını REST yükü ile satır içi iletiyoruz. Bir Kural değerlendirme beklentisi ve kural setinin test edileceği müşteri talebini belirtiyoruz. Ayrıca, istekle eşleşmeyen ifadeler de dahil olmak üzere, rapora dahil edilmesi gereken tüm Kurallar dili ifadelerinin sonuçlarını belirtmek için "FULL" değerini kullanarak test raporunun ne kadar eksiksiz olduğunu belirtebilirsiniz.
{ "source": { "files": [ { "name": "firestore.rules", "content": "service cloud.firestore { match /databases/{database}/documents { match /users/{userId}{ allow read: if (request.auth.uid == userId); } function doc(subpath) { return get(/databases/$(database)/documents/$(subpath)).data; } function isAccountOwner(accountId) { return request.auth.uid == accountId || doc(/users/$(request.auth.uid)).accountId == accountId; } match /licenses/{accountId} { allow read: if isAccountOwner(accountId); } } }" } ] }, "testSuite": { "testCases": [ { "expectation": "ALLOW", "request": { "auth": {"uid": "123"}, "path": "/databases/(default)/documents/licenses/abcd", "method": "get"}, "functionMocks": [ { "function": "get", "args": [{"exact_value": "/databases/(default)/documents/users/123"}], "result": {"value": {"data": {"accountId": "abcd"}}} } ] } ] } }
Daha sonra bu TestSuite
projects.test
yöntemiyle değerlendirmeye gönderebiliriz.
curl -X POST -d '{
' $(cat testcase.json) '
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets/uuid123:test'
Döndürülen TestReport
(test BAŞARILI/BAŞARISIZ durumunu, hata ayıklama mesajlarının listelerini, ziyaret edilen Kural ifadelerinin listelerini ve bunların değerlendirme raporlarını içerir), erişime uygun şekilde izin verildiğini BAŞARI durumuyla onaylar.
Hizmetler arası Bulut Depolama Güvenlik Kuralları için izinleri yönetin
Güvenlik koşullarını değerlendirmek için Cloud Firestore belge içeriklerini kullanan Cloud Storage Güvenlik Kuralları oluşturursanız, Firebase konsolunda veya Firebase CLI'de iki ürünü bağlamak için izinleri etkinleştirmeniz istenir.
Bu tür bir hizmetler arası güvenliği devre dışı bırakmaya karar verirseniz:
İlk olarak, özelliği devre dışı bırakmadan önce kurallarınızı düzenleyin ve Cloud Firestore'a erişmek için Kural işlevlerini kullanan tüm ifadeleri kaldırın. Aksi takdirde, özellik devre dışı bırakıldıktan sonra Kural değerlendirmeleri, Depolama taleplerinizin başarısız olmasına neden olur.
Rolleri iptal etmek için Bulut kılavuzunu izleyerek "Firebase Rules Firestore Service Agent" rolünü silmek için Google Cloud Console'daki IAM sayfasını kullanın.
Firebase CLI'den veya Firebase konsolundan hizmetlerarası Kuralları bir sonraki kaydettiğinizde özelliği yeniden etkinleştirmeniz istenecektir.