Zum Inhalt

Granulares Permissions-System

Übersicht

Das System verwendet ein zweistufiges Berechtigungssystem:

  1. Rollen (UserRoleEnum) - Grundlegende Zugriffsebene
  2. 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)

UserPermissions.readOnly()
// Alle Flags = false

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)

UserPermissions.superAdmin()
// Gleich wie Admin, aber zusätzlich User-Verwaltung

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

  1. Permissions nur durch SuperAdmin änderbar
  2. Firestore Rules blockieren Permission-Änderungen durch normale User

  3. Admin vs SuperAdmin Unterschied

  4. Admins können Geschäftsdaten UND System-Settings verwalten
  5. Nur SuperAdmins können User-Berechtigungen verwalten

  6. Cloud Functions umgehen Rules

  7. Backend-Funktionen haben Admin-Zugriff unabhängig von Rules
  8. Zusätzliche Prüfungen in Functions einbauen bei kritischen Operationen

  9. Default Permissions

  10. Neue User starten immer mit readOnly() Permissions
  11. Muss explizit durch SuperAdmin erweitert werden

  12. Source-System Integration

  13. Wenn ein Quellsystem (Customer/Article/Order) aktiviert wird, werden automatisch alle entsprechenden Permissions von ALLEN Usern entfernt
  14. Dies verhindert, dass User Daten ändern die aus einem externen System synchronisiert werden
  15. 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
)

Szenario 5: IT-Administrator

User(
  userRole: UserRoleEnum.superadmin,
  // Permissions werden ignoriert - hat alle Rechte
  // Kann System-Settings ändern
  // Kann User-Rollen vergeben
  // Kann User-Permissions konfigurieren
)