# Workflow Portal – Dokumentation ## Übersicht Das Workflow Portal ist eine Web-Anwendung zur Verwaltung von Arbeitsvorlagen und Aufgaben, mit integrierter Active Directory / LDAP-Anbindung für die Nutzerverwaltung. --- ## Architektur | Komponente | Technologie | Port | |---|---|---| | **Backend** | Express.js + SQLite3 + ldapjs | 5000 | | **Frontend** | React 18 + Vite + TailwindCSS + DaisyUI | 5173 | | **Prisma Studio** | Prisma v5.22.0 | 5555 | | **Datenbank** | SQLite (`backend/data/workflow.db`) | – | --- ## Nutzerarten ### Lokale Nutzer - Werden manuell im Portal angelegt - Anmeldung mit **E-Mail + Passwort** - Vollständig bearbeitbar (Name, E-Mail, Passwort, Rolle, Status) - Können gelöscht werden ### Active Directory Nutzer - Werden automatisch aus dem AD/LDAP synchronisiert - Anmeldung mit **AD-Benutzeranmeldename (sAMAccountName) + AD-Passwort** - Die Authentifizierung erfolgt direkt gegen den LDAP-Server - **Bearbeitbar im Portal:** Rolle (admin/user) und Status (aktiv/inaktiv) - **Schreibgeschützt:** Name, E-Mail, Anmeldename, Passwort (werden aus dem AD synchronisiert) - **Nicht löschbar** im Portal – müssen im AD entfernt werden > **Wichtig:** Lokal geänderte Rollen und Status werden beim nächsten LDAP-Sync **nicht** überschrieben. Name, E-Mail und Anmeldename werden jedoch bei jedem Sync aktualisiert. --- ## LDAP-Konfiguration Die LDAP-Einstellungen werden über Umgebungsvariablen in der `.env`-Datei konfiguriert: | Variable | Beschreibung | Beispiel | |---|---|---| | `LDAP_SERVER` | Hostname des LDAP-Servers | `PIDC02.seatle.intra` | | `LDAP_PORT` | Port (389=LDAP, 636=LDAPS) | `636` | | `LDAP_SEARCH_BASE` | Suchbasis für Nutzer | `DC=SEATLE,DC=INTRA` | | `LDAP_DOMAIN` | Domäne (für Referenz) | `SEATLE` | | `LDAP_IGNORE_CERT_ERRORS` | Zertifikatsprüfung überspringen | `true` / `false` | | `LDAP_BIND_USER` | Service-Account (user@domain) | `MustermannM@seatle.intra` | | `LDAP_BIND_PASSWORD` | Passwort des Service-Accounts | `Verwaltung1!` | | `LDAP_SYNC_INTERVAL` | Sync-Intervall in ms (Standard: 300000 = 5 Min) | `300000` | | `LDAP_FILTER` | LDAP-Suchfilter (leer = Standard) | leer | | `LDAP_ATTRIBUTES` | LDAP-Attribute (kommagetrennt) | `mail,displayName,memberOf,distinguishedName,sAMAccountName` | --- ## Anmeldung ### Lokaler Admin - **E-Mail:** `admin@workflow.local` - **Passwort:** `1337` ### AD-Nutzer - **Anmeldename:** sAMAccountName aus dem AD (z.B. `MustermannM`) - **Passwort:** Das AD-Passwort des Nutzers - Die Anmeldung erfolgt per LDAP-Bind direkt gegen den AD-Server ### Status-basierte Zugangsbeschränkung - **aktiv:** Anmeldung erlaubt - **inaktiv:** Anmeldung wird blockiert (gilt für lokale UND AD-Nutzer) --- ## Rollen | Rolle | Berechtigungen | |---|---| | `admin` | Vollzugriff: Vorlagen erstellen/bearbeiten, Nutzerverwaltung, alle Aufgaben einsehen | | `user` | Eingeschränkter Zugriff: Zugewiesene Vorlagen ausfüllen, eigene Aufgaben einsehen | --- ## LDAP-Sync Verhalten Der Sync läuft automatisch alle 5 Minuten (konfigurierbar über `LDAP_SYNC_INTERVAL`). ### Was synchronisiert wird: - **Neue AD-Nutzer** → werden in der Datenbank angelegt (Status: aktiv, Rolle: abgeleitet aus AD-Gruppen) - **Bestehende AD-Nutzer** → Name und Anmeldename werden aktualisiert - **Entfernte AD-Nutzer** → werden aus der Datenbank gelöscht (wenn sie nicht mehr im AD gefunden werden) ### Was NICHT überschrieben wird: - **Rolle** (admin/user) – lokal geänderte Rollen bleiben erhalten - **Status** (aktiv/inaktiv) – lokal geänderte Status bleiben erhalten ### Rollen-Ableitung aus AD-Gruppen: - Nutzer in einer Admin-Gruppe (`admin`, `Domain Admins`, `Domänen-Admins`) → Rolle `admin` - Alle anderen → Rolle `user` --- ## Docker ### Container starten ```bash docker compose up -d --build ``` ### Container stoppen ```bash docker compose down ``` ### Backend-Logs anzeigen ```bash docker compose logs backend --tail 50 ``` ### Datenbank zurücksetzen ```bash docker compose down rm backend/data/workflow.db docker compose up -d --build ``` --- ## API-Endpunkte ### Auth | Methode | Endpunkt | Beschreibung | |---|---|---| | POST | `/api/auth/login` | Anmeldung (E-Mail/Username + Passwort) | | POST | `/api/auth/register` | Neuen lokalen Nutzer registrieren | ### Nutzer | Methode | Endpunkt | Beschreibung | |---|---|---| | GET | `/api/users` | Alle Nutzer auflisten | | POST | `/api/users` | Neuen lokalen Nutzer anlegen | | PUT | `/api/users/:id` | Nutzer bearbeiten (AD: nur Rolle/Status) | | DELETE | `/api/users/:id` | Lokalen Nutzer löschen (AD-Nutzer: 403) | ### AD-Status | Methode | Endpunkt | Beschreibung | |---|---|---| | GET | `/api/ad/status` | LDAP-Konfigurationsstatus | ### Vorlagen & Aufgaben | Methode | Endpunkt | Beschreibung | |---|---|---| | GET/POST | `/api/templates` | Vorlagen auflisten/erstellen | | GET/PUT/DELETE | `/api/templates/:id` | Vorlage abrufen/ändern/löschen | | GET/POST | `/api/tasks` | Aufgaben auflisten/erstellen | | PUT | `/api/tasks/:id` | Aufgabe aktualisieren | --- ## Sicherheitshinweise - **LDAP_IGNORE_CERT_ERRORS=true** deaktiviert die Zertifikatsprüfung. In Produktion sollte das CA-Zertifikat des LDAP-Servers im Container installiert werden. - Passwörter werden als Klartext in der SQLite-Datenbank gespeichert (nur für lokale Nutzer). Für Produktion sollte bcrypt o.ä. verwendet werden. - AD-Passwörter werden **nicht** gespeichert – die Authentifizierung erfolgt direkt per LDAP-Bind.