Firebase Security Rules, depolanan verilerinize erişimi kontrol etmenize olanak tanır. Esnek kural söz dizimi, tüm veritabanına yapılan yazma işlemlerinden belirli bir doküman üzerindeki işlemlere kadar her şeyle eşleşen kurallar oluşturabileceğiniz anlamına gelir.
Bu kılavuzda, uygulamanızı ayarlarken ve verilerinizi korurken uygulamak isteyebileceğiniz daha temel kullanım alanlarından bazıları açıklanmaktadır. Ancak kural yazmaya başlamadan önce, kuralların yazıldığı dil ve davranışları hakkında daha fazla bilgi edinmek isteyebilirsiniz.
Kurallarınıza erişmek ve kurallarınızı güncellemek için Firebase Security Rules uygulamasını yönetme ve dağıtma başlıklı makalede açıklanan adımları uygulayın.
Yapay Zeka Desteği için yapay zeka istemi
Yapay zeka desteği için aşağıdaki istemi yapay zeka kodlama temsilcinize (ör. Android Studio'da Gemini, Antigravity, Claude Code, Codex ve Cursor) kopyalayın. İstemi özelleştirebilir ve temsilcinizle birlikte üzerinde çalışabilirsiniz. Ayrıntılı kurulum bilgileri için Firebase aracı becerileri sayfasını ziyaret edin.
Help me use Firebase in my app.
1. Make sure that **Firebase agent skills** are installed and updated. For Claude Code, Codex, or Cursor agents, help me install the Firebase plugin. For other agents, run `npx skills add firebase/agent-skills`. Always try to use **Firebase agent skills** for Firebase-related tasks.
2. Help me write, validate, and deploy Firebase Security Rules to protect my app's data.
Varsayılan kurallar: Kilitli mod
Firebase konsolunda bir veritabanı veya depolama alanı örneği oluşturduğunuzda, Firebase Security Rules verilerinize erişimi kısıtlayıp kısıtlamayacağını (Kilitli mod) veya herkesin erişimine izin verip vermeyeceğini (Test modu) seçersiniz. Cloud Firestore ve Realtime Database'da, Kilitli mod için varsayılan kurallar tüm kullanıcıların erişimini engeller. Cloud Storage'da, 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şim isteyebilirsiniz. Uygulamanızı üretim sürümüne dağıtmadan önce Security Rules dosyanızı güncellediğinizden emin olun. Ayrıca uygulamanızı dağıtırsanız başlatmamış olsanız bile herkese açık olarak erişilebilir olacağını unutmayın.
Firebase'in istemcilere verilerinize doğrudan erişim izni verdiğini ve kötü amaçlı kullanıcıların erişimini engelleyen tek korumanın Firebase Security Rules olduğunu unutmayın. Kuralları ürün mantığından ayrı olarak tanımlamanın çeşitli avantajları vardır: İstemciler güvenliği uygulamaktan sorumlu değildir, hatalı uygulamalar verilerinizin güvenliğini tehlikeye atmaz ve en önemlisi, verileri dünyadan korumak için bir aracı sunucuya güvenmeniz gerekmez.
Tüm kimliği doğrulanmış kullanıcılar
Verilerinizi oturum açmış tüm kullanıcıların erişimine açık bırakmanızı ö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 doğru şekilde erişim izni verildiğinden emin olun. Kullanıcı tabanlı erişim ayarlamak için Authentication, veri tabanlı erişim ayarlamak için ise doğrudan veritabanınızdan okuma yöntemini kullanın.
Kurallarınızı oluşturma şekliniz, farklı yollardaki verilere erişimi nasıl kısıtlayacağınızı etkiler. Bu nedenle, verilerinizi yapılandırırken kurallar yazmayı düşünün.
Yalnızca içerik sahibi erişimi
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: Veriler kullanıcıya göre ayrılmışsa (verilere erişmesi gereken tek kullanıcı, verileri oluşturan kullanıcıysa) bu kural iyi sonuç verir.
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 veya oluşturdukları verilere erişemez.
Bu kuralı oluşturmak için: Veri okuma veya yazma erişimi isteyen kullanıcının, verilerin sahibi 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 gizli erişim
Bu kural, herkesin bir veri kümesini okumasına izin verir ancak belirli bir yolda veri oluşturma veya değiştirme yetkisini 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 sahiplerine düzenleme erişimini kısıtlaması gereken uygulamalar için idealdir. Örneğin, bir sohbet uygulaması veya blog.
Bu kuralın işe yaramadığı durumlar: Yalnızca içerik sahibi kuralında olduğu gibi, bu kural grubu da birden fazla kullanıcının aynı verileri düzenlemesi gerektiğinde işe yaramaz. Kullanıcılar birbirlerinin verilerinin üzerine yazacaktır.
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;
}
}
}
Özelliğe dayalı ve role dayalı erişim
Bu kuralın çalışması için verilerinizdeki kullanıcılara özellikler tanımlamanız ve atamanız gerekir. Firebase Security Rules, erişimi onaylamak veya reddetmek için isteği veritabanınızdaki ya da dosyanın meta verilerindeki verilerle karşılaştırır.
Bu kuralın geçerli olduğu durumlar: Kullanıcılara rol atıyorsanız bu kural, rollere veya belirli kullanıcı gruplarına göre erişimi sınırlamanıza olanak tanır. Örneğin, notları depoluyorsanız "öğrenciler" grubuna (yalnızca kendi içeriklerini okuma), "öğretmenler" grubuna (kendi konularını okuma ve yazma) ve "müdürler" grubuna (tüm içerikleri okuma) farklı erişim düzeyleri atayabilirsiniz.
Bu kuralın çalışmadığı durumlar: Realtime Database ve Cloud Storage dillerinde kurallarınız, Cloud Firestore kurallarının dahil edebileceği get() yöntemini kullanamaz.
Bu nedenle, veritabanınızı veya dosya meta verilerinizi kurallarınızda kullandığınız özellikleri yansıtacak şekilde yapılandırmanız gerekir.
Bu kuralı ayarlamak için: Cloud Firestore'da, kullanıcılarınızın dokümanlarına okuyabileceğiniz bir alan ekleyin, ardından kuralınızı bu alanı okuyacak ve koşullu olarak erişim izni verecek şekilde 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 özel hak talepleri oluşturabilir ve ardından bu bilgileri herhangi bir Firebase Security Rules içindeki auth.token değişkeninden alabilirsiniz.
Verilerle tanımlanan özellikler ve roller
Bu kurallar yalnızca Cloud Firestore ve Realtime Database dillerinde çalışır.
Cloud Firestore
Kurallarınızda aşağıdaki kurallar gibi bir okuma işlemi olduğunda Cloud Firestore uygulamasında bir okuma işlemi için faturalandırılırsınız.
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 uygulamasında özel hak talepleri oluşturun ve ardından bu hak taleplerini 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;
}
}
Kiralama özellikleri
Bu kuralları uygulamak için Google Cloud Identity Platform'da (GCIP) çoklu müşteri mimarisini ayarlayın ve ardından kurallarınızda kiracıyı kullanın. Aşağıdaki örneklerde, belirli bir kiracıdaki (ör. tenant2-m6tyz) bir kullanıcının yazma işlemlerine izin verilmektedir.
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;
}
}