- Datenmodell: users/{uid}, households/{id} mit memberUids, plants/locations als Subcollections
- StreamProvider liefern Live-Daten, Repositories kapseln Schreibzugriffe
- Login-Screen mit Registrierung (legt Haushalt automatisch an), Logout in Einstellungen
- Router-Redirect bei Login/Logout, firestore.rules mit Haushalts-Prinzip
- Tests auf firebase_auth_mocks + fake_cloud_firestore umgestellt
- Verifiziert: analyze/test grün, Android-Debug-Build erfolgreich
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
41 lines
1.4 KiB
Text
41 lines
1.4 KiB
Text
rules_version = '2';
|
|
|
|
// Sicherheitsregeln für LeafItToMe.
|
|
//
|
|
// Grundprinzip: Alle App-Daten hängen an einem Haushalt. Lesen und Schreiben
|
|
// darf nur, wer im Feld `memberUids` des Haushalts steht. Das eigene
|
|
// Nutzer-Dokument (users/{uid}) darf nur der Nutzer selbst sehen.
|
|
service cloud.firestore {
|
|
match /databases/{database}/documents {
|
|
|
|
function signedIn() {
|
|
return request.auth != null;
|
|
}
|
|
|
|
function isMember(householdId) {
|
|
return signedIn()
|
|
&& request.auth.uid in get(/databases/$(database)/documents/households/$(householdId)).data.memberUids;
|
|
}
|
|
|
|
// Eigenes Nutzerprofil (enthält u. a. die householdId).
|
|
match /users/{uid} {
|
|
allow read, write: if signedIn() && request.auth.uid == uid;
|
|
}
|
|
|
|
match /households/{householdId} {
|
|
// Lesen/Ändern nur für Mitglieder.
|
|
allow read, update: if signedIn() && request.auth.uid in resource.data.memberUids;
|
|
// Anlegen nur, wenn man sich selbst als Mitglied einträgt
|
|
// (passiert automatisch bei der Registrierung).
|
|
allow create: if signedIn() && request.auth.uid in request.resource.data.memberUids;
|
|
// Löschen von Haushalten ist bewusst nicht erlaubt.
|
|
allow delete: if false;
|
|
|
|
// Alle Unterdaten des Haushalts (plants, locations, ...):
|
|
// voller Zugriff für Mitglieder, niemand sonst.
|
|
match /{document=**} {
|
|
allow read, write: if isMember(householdId);
|
|
}
|
|
}
|
|
}
|
|
}
|