Granulares Permissions-System¶
Übersicht¶
Das System verwendet ein zweistufiges Berechtigungssystem:
- Rollen (UserRoleEnum) - Grundlegende Zugriffsebene
- Granulare Permissions - Individuelle Berechtigungen pro User
Rollen (UserRoleEnum)¶
1️⃣ User (0) - Vertriebsmitarbeiter¶
Basis-Zugriff: - ✅ Alle Daten lesen (Kunden, Artikel, Bestellungen, Statistiken) - ❌ Standardmäßig KEINE Schreibrechte
Individuelle Berechtigungen:
- Schreibrechte werden über permissions-Objekt pro User konfiguriert
- Kann in der Benutzerverwaltung individuell eingestellt werden
2️⃣ Admin (1) - Geschäftsführer/Manager¶
Vollzugriff auf: - ✅ Alle Kunden (erstellen, bearbeiten, löschen) - ✅ Alle Artikel (erstellen, bearbeiten, löschen) - ✅ Alle Bestellungen (erstellen, bearbeiten, löschen) - ✅ Kategorien (Artikel, Kunden, Package Sizes) - ✅ Statistiken aller Mitarbeiter - ✅ Push-Benachrichtigungen versenden - ✅ System-Einstellungen ändern
KANN NICHT: - ❌ Benutzer-Rollen ändern - ❌ User-Permissions ändern - ❌ Benutzer erstellen/löschen
3️⃣ SuperAdmin (2) - IT/Owner¶
Vollzugriff auf ALLES: - ✅ Alle Admin-Rechte - ✅ Benutzer erstellen, bearbeiten, löschen - ✅ Benutzer-Rollen vergeben - ✅ User-Permissions konfigurieren - ✅ Connector-Credentials verwalten
Granulare Permissions (UserPermissions)¶
Jeder User hat ein permissions-Objekt mit folgenden Flags:
Kunden-Berechtigungen¶
bool canCreateCustomers // Kunden anlegen
bool canEditCustomers // Kunden bearbeiten
bool canDeleteCustomers // Kunden löschen
Artikel-Berechtigungen¶
bool canCreateArticles // Artikel anlegen
bool canEditArticles // Artikel bearbeiten
bool canDeleteArticles // Artikel löschen
Bestellungen-Berechtigungen¶
bool canCreateOrders // Bestellungen anlegen
bool canEditOrders // Bestellungen bearbeiten
bool canDeleteOrders // Bestellungen löschen
Standard-Permissions nach Rolle¶
User (Standard: Nur Lesen)¶
Admin (Standard: Alles)¶
UserPermissions.admin()
canCreateCustomers: true
canEditCustomers: true
canDeleteCustomers: true
canCreateArticles: true
canEditArticles: true
canDeleteArticles: true
canCreateOrders: true
canEditOrders: true
canDeleteOrders: true
SuperAdmin (Standard: Alles)¶
Firestore Security Rules¶
System Settings¶
// Nur Admin und SuperAdmin können ändern
allow read: if isAuthenticated();
allow write: if isAdmin(); // userRole >= 1
Users Collection¶
// Lesen: Alle
allow read: if isAuthenticated();
// User kann eigene Daten ändern (NICHT userRole/permissions)
allow update: if isAuthenticated() && request.auth.uid == userId
&& !('userRole' in request.resource.data.diff(resource.data))
&& !('permissions' in request.resource.data.diff(resource.data));
// Nur SuperAdmin kann User verwalten
allow create, delete: if isSuperAdmin();
allow update: if isSuperAdmin(); // Überschreibt obige Regel für SuperAdmin
Customers, Articles, Orders¶
// Lesen: Alle
allow read: if isAuthenticated();
// Schreiben: Admin ODER User mit entsprechender Permission
allow create: if isAdmin() || hasPermission('canCreateCustomers');
allow update: if isAdmin() || hasPermission('canEditCustomers');
allow delete: if isAdmin() || hasPermission('canDeleteCustomers');
Verwendung im Code¶
Permissions prüfen¶
// Im User-Objekt
if (user.permissions.canCreateCustomers) {
// Zeige "Kunde anlegen" Button
}
if (user.permissions.hasAnyArticlePermission) {
// User hat mindestens eine Artikel-Berechtigung
}
// Rolle prüfen
if (user.userRole == UserRoleEnum.admin || user.userRole == UserRoleEnum.superadmin) {
// Zeige Admin-Bereich
}
User erstellen mit Custom Permissions¶
final newUser = User(
firstName: 'Max',
lastName: 'Mustermann',
email: 'max@example.com',
userRole: UserRoleEnum.user,
language: LanguageEnum.de,
permissions: UserPermissions(
canCreateOrders: true, // Darf Bestellungen erstellen
canEditOrders: true, // Darf Bestellungen bearbeiten
canEditCustomers: true, // Darf Kunden bearbeiten
// Rest bleibt false
),
);
Permissions aktualisieren¶
final updatedUser = currentUser.copyWith(
permissions: currentUser.permissions.copyWith(
canDeleteArticles: true, // Artikel-Löschrecht hinzufügen
),
);
Migration bestehender User¶
Bestehende User ohne permissions-Feld erhalten automatisch Standard-Permissions basierend auf ihrer Rolle:
// Im User.fromMap Constructor
permissions: json['permissions'] != null
? UserPermissions.fromMap(json['permissions'])
: null, // null wird zu Standard-Permissions der Rolle
Benutzerverwaltung UI¶
In der Benutzerverwaltung sollte es pro User folgende Einstellungen geben:
Rolle auswählen: - [ ] User (Standard: Nur Lesen) - [ ] Admin (Vollzugriff außer User-Verwaltung) - [ ] SuperAdmin (Vollzugriff auf alles)
Für User-Rolle - Individuelle Berechtigungen:
Kunden: - [ ] Anlegen - [ ] Bearbeiten - [ ] Löschen
Artikel: - [ ] Anlegen - [ ] Bearbeiten - [ ] Löschen
Bestellungen: - [ ] Anlegen - [ ] Bearbeiten - [ ] Löschen
⚠️ Hinweis: Permissions werden bei Admin/SuperAdmin ignoriert, da diese Rollen bereits Vollzugriff haben.
Sicherheitshinweise¶
- Permissions nur durch SuperAdmin änderbar
-
Firestore Rules blockieren Permission-Änderungen durch normale User
-
Admin vs SuperAdmin Unterschied
- Admins können Geschäftsdaten UND System-Settings verwalten
-
Nur SuperAdmins können User-Berechtigungen verwalten
-
Cloud Functions umgehen Rules
- Backend-Funktionen haben Admin-Zugriff unabhängig von Rules
-
Zusätzliche Prüfungen in Functions einbauen bei kritischen Operationen
-
Default Permissions
- Neue User starten immer mit
readOnly()Permissions -
Muss explizit durch SuperAdmin erweitert werden
-
Source-System Integration
- Wenn ein Quellsystem (Customer/Article/Order) aktiviert wird, werden automatisch alle entsprechenden Permissions von ALLEN Usern entfernt
- Dies verhindert, dass User Daten ändern die aus einem externen System synchronisiert werden
- Im User-Editor werden die Checkboxen disabled und eine orange Warnung angezeigt
Source-System Automatisierung¶
Beispiel-Szenarien¶
Szenario 1: Vertriebsmitarbeiter (nur Bestellungen)¶
User(
userRole: UserRoleEnum.user,
permissions: UserPermissions(
canCreateOrders: true,
canEditOrders: true,
// Kann keine Kunden/Artikel anlegen
),
)
Szenario 2: Junior Produktmanager¶
User(
userRole: UserRoleEnum.user,
permissions: UserPermissions(
canCreateArticles: true,
canEditArticles: true,
// Kann Artikel nicht löschen
),
)
Szenario 3: Customer Service¶
User(
userRole: UserRoleEnum.user,
permissions: UserPermissions(
canCreateCustomers: true,
canEditCustomers: true,
canEditOrders: true,
// Kann nichts löschen
),
)
Szenario 4: Geschäftsführer¶
User(
userRole: UserRoleEnum.admin,
// Permissions werden ignoriert - hat alle Rechte
// Kann System-Settings ändern
// Kann KEINE User-Rollen vergeben
)