Firebase Security Rules depolanan verilerinize erişimi kontrol etmenize olanak tanır. Esnek kurallar söz dizimi sayesinde, tüm yazma işlemlerinden veritabanının tamamına ve belirli bir belgedeki işlemlere kadar her şeyi eşleştiren kurallar oluşturabilirsiniz.
Bu kılavuzda, uygulamanızı ayarlarken ve verilerinizi korurken uygulamak isteyebileceğiniz daha temel kullanım alanlarından bazıları açıklanmaktadır. Ancak kuralları yazmaya başlamadan önce, yazıldıkları dil ve davranışları hakkında daha fazla bilgi edinmek isteyebilirsiniz.
Kurallarınıza erişmek ve bunları güncellemek için Firebase Security Rules yönetme ve dağıtma başlıklı makalede belirtilen adımları uygulayın.
Varsayılan kurallar: Kilitli mod
Firebase konsolunda bir veritabanı veya depolama örneği oluşturduğunuzda, Firebase Security Rules verilerinizin erişimini kısıtlayıp kısıtlamayacağını (Kilitli mod) veya herkese erişime izin verip vermeyeceğinizi (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 içinde, depolama paketlerine yalnızca kimliği doğrulanmış kullanıcılar 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 false;
}
}
}
Geliştirme ortamı kuralları
Uygulamanız üzerinde çalışırken verilerinize nispeten açık veya sınırsız erişmek isteyebilirsiniz. Uygulamanızı üretime dağıtmadan önce Rules sürümünü güncellediğinizden emin olun. Ayrıca, uygulamanızı dağıtırsanız başlatmamış olsanız bile herkese açık olarak erişilebileceğini unutmayın.
Firebase'in, istemcilerin verilerinize doğrudan erişmesine izin verdiğini ve Firebase Security Rules'nın kötü niyetli kullanıcıların erişimini engelleyen tek güvenlik önlemi olduğunu unutmayın. Kuralları ürün mantığından ayrı olarak tanımlamanın çeşitli avantajları vardır: Müşteriler güvenliği zorunlu kılmaktan sorumlu değildir, hatalı uygulamalar verilerinizi tehlikeye atmaz ve en önemlisi, verileri dünyadan korumak için bir aracı sunucuya güvenmezsiniz.
Tüm kimliği doğrulanmış kullanıcılar
Verilerinize oturum açmış tüm kullanıcıların erişebilmesini önermesek de uygulamanızı geliştirirken erişimi kimliği doğrulanmış tüm kullanıcılara açmak faydalı olabilir.
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
match /some_collection/{document} {
allow read, write: if request.auth != null;
}
}
}
Realtime Database
{
"rules": {
"some_path": {
".read": "auth.uid !== null",
".write": "auth.uid !== null"
}
}
}
Cloud Storage
service firebase.storage {
match /b/{bucket}/o {
match /some_folder/{fileName} {
allow read, write: if request.auth != null;
}
}
}
Üretime hazır kurallar
Uygulamanızı dağıtmaya hazırlanırken verilerinizin korunduğundan ve kullanıcılarınıza erişimin doğru şekilde verildiğinden emin olun. Kullanıcı tabanlı erişimi ayarlamak için Authentication, veri tabanlı erişimi ayarlamak içinse doğrudan veritabanınızdan okuma özelliğini kullanın.
Verilerinizi yapılandırırken kurallar yazmayı düşünün. Çünkü kurallarınızı ayarlama şekliniz, farklı yollardaki verilere erişimi nasıl kısıtladığınızı etkiler.
Yalnızca içerik sahibine özel erişim
Bu kurallar, erişimi yalnızca içeriğin kimliği doğrulanmış sahibiyle kısıtlar. Veriler yalnızca bir kullanıcı tarafından okunabilir ve yazılabilir. Veri yolu, kullanıcının kimliğini içerir.
Bu kuralın işe yaradığı durumlar: Bu kural, veriler kullanıcıya göre ayrılmışsa (ör. verilere erişmesi gereken tek kullanıcı, verileri oluşturan kullanıcıysa) iyi çalışır.
Bu kuralın çalışmadığı durumlar: Bu kural grubu, birden fazla kullanıcının aynı verileri yazması veya okuması gerektiğinde çalışmaz. Kullanıcılar verilerin üzerine yazar ya da oluşturdukları verilere erişemez.
Bu kuralı ayarlamak için: Verileri okuma veya yazma erişimi isteyen kullanıcının, söz konusu verilerin sahibi olan kullanıcı olduğunu doğrulayan bir kural oluşturun.
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// Allow only authenticated content owners access
match /some_collection/{userId}/{document} {
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>/file.txt"
match /user/{userId}/{fileName} {
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 belirli bir yoldaki verileri oluşturma veya değiştirme özelliğini yalnızca kimliği doğrulanmış içerik sahibiyle kısıtlar.
Bu kuralın işe yaradığı durumlar: Bu kural, herkese açık olarak okunabilir öğeler gerektiren ancak bu öğelerin sahiplerinin düzenleme erişimini kısıtlaması gereken uygulamalar için uygundur. Örneğin, bir sohbet uygulaması veya blog.
Bu kuralın çalışmadığı durumlar: Yalnızca içerik sahibine yönelik kural gibi, bu kural grubu da birden fazla kullanıcının aynı verileri düzenlemesi gerektiğinde çalışmaz. Kullanıcılar sonunda birbirlerinin verilerinin üzerine yazar.
Bu kuralı ayarlamak için: Tüm kullanıcılar (veya kimliği doğrulanmış tüm kullanıcılar) için okuma erişimini etkinleştiren ve veri yazan kullanıcının sahip olduğunu onaylayan bir kural oluşturun.
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// Allow public read access, but only content owners can write
match /some_collection/{document} {
// Allow public reads
allow read: if true
// Allow creation if the current user owns the new document
allow create: if request.auth.uid == request.resource.data.author_uid;
// Allow updates by the owner, and prevent change of ownership
allow update: if request.auth.uid == request.resource.data.author_uid
&& request.auth.uid == resource.data.author_uid;
// Allow deletion if the current user owns the existing document
allow 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>/file.txt"
match /user/{userId}/{fileName} {
allow read;
allow write: if request.auth.uid == userId;
}
}
}
Özellik tabanlı ve rol tabanlı erişim
Bu kuralın çalışması için verilerinizdeki kullanıcılara özellikleri tanımlayıp atamanız gerekir. Firebase Security Rules Erişimi onaylamak veya reddetmek için isteği veritabanınızdaki ya da dosyanızın meta verilerindeki verilerle karşılaştırın.
Bu kuralın işe yaradığı durumlar: Kullanıcılara rol atıyorsanız bu kural, erişimi roller veya belirli kullanıcı gruplarına göre sınırlamanıza olanak tanır. Örneğin, notları saklıyorsanız "öğrenciler" grubuna (yalnızca içeriklerini okuma), "öğretmenler" grubuna (konularında okuma ve yazma) ve "müdürler" grubuna (tüm içeriği okuma) farklı erişim düzeyleri atayabilirsiniz.
Bu kuralın çalışmadığı durumlar: Realtime Database ve Cloud Storage'de kurallarınız, Cloud Firestore kurallarının kullanabileceği get()
yöntemini kullanamaz.
Bu nedenle, kurallarınızda kullandığınız özellikleri yansıtacak şekilde veritabanınızı veya dosya meta verilerinizi yapılandırmanız gerekir.
Bu kuralı ayarlamak için: Cloud Firestore bölümünde, kullanıcılarınızın dokümanlarında okuyabileceğiniz bir alan ekleyin, ardından bu alanı okuyacak ve koşullu olarak erişim izni verecek şekilde kuralınızı yapılandırın. Realtime Database içinde, uygulamanızın kullanıcılarını tanımlayan ve onlara bir alt düğümde rol veren bir veri yolu oluşturun.
Ayrıca Authentication içinde Firebase Security Rules'de Firebase Security Rules'deki auth.token
değişkeninden bu bilgileri alabilirsiniz.
Verilerle tanımlanan özellikler ve roller
Bu kurallar yalnızca Cloud Firestore ve Realtime Database'da geçerlidir.
Cloud Firestore
Kurallarınızda okuma işlemi olduğunda (ör. aşağıdaki kurallar) Cloud Firestore'da okuma işlemi için faturalandırılacağı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"
}
}
}
Realtime Database
{
"rules": {
"some_path": {
"${subpath}": {
//
".write": "root.child('users').child(auth.uid).child('role').val() === 'admin'",
".read": true
}
}
}
}
Özel talep özellikleri ve rolleri
Bu kuralları uygulamak için Firebase Authentication içinde özel talepler oluşturun ve ardından talepleri kurallarınızda kullanın.
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// For attribute-based access control, check for an administrator 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 use
".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ılık özellikleri
Bu kuralları uygulamak için Google Cloud Identity Platform'da (GCIP) çoklu kiracılığı ayarlayın ve ardından kurallarınızda kiracıyı kullanın. Aşağıdaki örnekler, belirli bir kiracıdaki bir kullanıcının (ör. tenant2-m6tyz
) yazma işlemlerine izin verir.
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;
}
}