Firebase Security Rules & Cloud Functions¶
Wichtige Unterscheidung¶
🔒 Security Rules gelten für:¶
- Client Apps (Web, iOS, Android)
- Direkte Firebase SDK Zugriffe
- Firestore REST API (mit User-Authentifizierung)
🔓 Security Rules gelten NICHT für:¶
- Cloud Functions (nutzen Admin SDK)
- Firebase Admin SDK (Server-seitig)
- Service Accounts
Wie Cloud Functions auf Firestore zugreifen¶
❌ FALSCH - Client SDK (unterliegt Security Rules)¶
// In Client-Apps - WIRD von Security Rules geprüft
import { getFirestore } from 'firebase/firestore';
const db = getFirestore();
await db.collection('orders').add({...}); // ← Unterliegt Security Rules
✅ RICHTIG - Admin SDK in Cloud Functions (umgeht Security Rules)¶
// In Cloud Functions - UMGEHT Security Rules
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();
await db.collection('orders').add({...}); // ← Voller Admin-Zugriff!
Deine Functions nutzen Admin SDK¶
Schaue in /functions/index.js:
const admin = require('firebase-admin');
admin.initializeApp();
// Diese Zeile gibt deinen Functions VOLLEN Zugriff
const db = admin.firestore();
Bedeutung:
- Deine Cloud Functions können IMMER auf Firestore zugreifen
- Auch wenn Security Rules allow read, write: if false; haben
- Auch wenn keine Authentifizierung vorhanden ist
Beispiel: Statistik-Berechnung¶
// functions/internal_statistic_calculation.js
const admin = require('firebase-admin');
const db = admin.firestore();
// Cloud Function schreibt Statistiken
exports.calculateStatistics = functions.pubsub
.schedule('every 24 hours')
.onRun(async (context) => {
// ✅ Funktioniert IMMER - auch wenn Security Rules
// für normale User "write: if false" haben
await db.collection('articleSalesStatistics').doc('today').set({
totalSales: 1000,
calculatedAt: admin.firestore.FieldValue.serverTimestamp()
});
});
Security Rules:
match /articleSalesStatistics/{statId} {
allow read: if isAuthenticated();
allow write: if false; // ← Normale User können NICHT schreiben
// Aber Cloud Functions KÖNNEN trotzdem schreiben!
}
Best Practices für Production¶
1. Statistics Collections - Nur Functions schreiben¶
match /articleSalesStatistics/{statId} {
allow read: if isAuthenticated();
allow write: if false; // Nur Cloud Functions (Admin SDK) können schreiben
}
2. Orders - User können erstellen, Functions können alles¶
match /orders/{orderId} {
allow read: if isAuthenticated();
allow create: if isAuthenticated();
allow update: if isAuthenticated() &&
(!resource.data.keys().hasAny(['sourceSystem']));
allow delete: if false; // Nur Cloud Functions können löschen
}
3. Audit Logs - Nur Functions schreiben¶
match /auditLogs/{logId} {
allow read: if request.auth != null &&
request.auth.token.admin == true; // Nur Admins
allow write: if false; // Nur Cloud Functions
}
Wie testest du das?¶
1. Security Rules testen (Client-Perspektive)¶
# Emulator starten
firebase emulators:start --only firestore
# In deiner App testen
# Sollte FEHLSCHLAGEN wenn Rules es verbieten
2. Cloud Function testen¶
# Function lokal ausführen
firebase emulators:start --only functions,firestore
# Function aufrufen
# Sollte FUNKTIONIEREN auch wenn Rules es verbieten
Zusammenfassung¶
| Zugriff über | Security Rules | Beispiel |
|---|---|---|
| Flutter App | ✅ Ja | FirebaseFirestore.instance.collection('orders') |
| Web App | ✅ Ja | getFirestore().collection('orders') |
| Cloud Function | ❌ Nein | admin.firestore().collection('orders') |
| Admin SDK (Server) | ❌ Nein | admin.firestore() |
| REST API (mit Auth) | ✅ Ja | https://firestore.googleapis.com/v1/... |
Merke:
- Wenn admin.firestore() → Voller Zugriff, Rules egal
- Wenn Firebase SDK → Security Rules gelten
- Cloud Functions = Vertrauenswürdiger Server-Code = Voller Zugriff