From 95541e8ac4777b843126390d6b0444622c935b93 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Tue, 19 May 2026 08:44:48 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20DSGVO-Rolle=20sieht=20Men=C3=BCpunkte=20?= =?UTF-8?q?in=20Einstellungen=20wieder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit System-Block in Settings.tsx war komplett in hasPermission('settings:update') gewickelt. DSGVO-User haben aber nur audit:* und gdpr:* Perms – kein settings:update – und sahen damit weder DSGVO-Dashboard, Datenschutzerklärung, Vollmacht-Vorlage, Impressum, Website-Datenschutz, E-Mail-Versandlog noch Audit-Log. Outer-Check auf (settings:update || audit:read || gdpr:admin) erweitert. Innere Per-Card-Checks bleiben unverändert, sodass jeder User nur das sieht, wofür er Perms hat. Backend-API mit reinem DSGVO-Token gegengetestet: alle 9 Endpoints liefern 200 – Routes hatten kein Permission-Problem. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/todo.md | 19 +++++++++++++++++++ frontend/src/pages/Settings.tsx | 8 +++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/docs/todo.md b/docs/todo.md index 5f3eed49..e42a0f9f 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -97,6 +97,25 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung ## ✅ Erledigt +- [x] **🐛 DSGVO-Rolle: Menüpunkte in den Einstellungen unsichtbar** + - Symptom: User mit ausschließlich DSGVO-Rolle sah keinerlei + Karten unter Einstellungen → System (DSGVO-Dashboard, + Datenschutzerklärung, Vollmacht-Vorlage, Impressum, + Website-Datenschutz, E-Mail-Versandlog, Audit-Protokoll). + - Ursache: Der gesamte System-Block in `frontend/src/pages/Settings.tsx` + war in `hasPermission('settings:update')` eingewickelt. DSGVO + hat aber nur `audit:*` und `gdpr:*` Perms – kein `settings:update`. + - Fix: Outer-Check erweitert auf + `settings:update || audit:read || gdpr:admin`. Jede Karte hat + weiterhin ihren eigenen feingranularen Check; für DSGVO-User + erscheinen nur die DSGVO-/Audit-Karten. + - Backend-API mit reiner DSGVO-Rolle (kein Admin) live durchgetestet: + `/api/gdpr/dashboard`, `/api/audit-logs`, `/api/email-logs`, + `/api/gdpr/privacy-policy`, `/api/gdpr/authorization-template`, + `/api/gdpr/imprint`, `/api/gdpr/website-privacy-policy`, + `/api/gdpr/consents/overview`, `/api/gdpr/deletions` → alle 200. + Backend war nicht das Problem. + - [x] **🛡️ Login-Rate-Limit jetzt pro (IP + Email)-Tupel** - Vorher reine IP-basierte Sperre, was zwei Schwächen hatte: a) Familie hinter NAT: Max vertippt sich → Nina kommt nicht rein diff --git a/frontend/src/pages/Settings.tsx b/frontend/src/pages/Settings.tsx index 5f50e00b..1ed0b244 100644 --- a/frontend/src/pages/Settings.tsx +++ b/frontend/src/pages/Settings.tsx @@ -88,7 +88,13 @@ export default function Settings() { {/* System-Einstellungen */} - {hasPermission('settings:update') && ( + {/* + Outer-Check umfasst BEWUSST `settings:update`, `audit:read` und + `gdpr:admin`, sonst sieht die DSGVO-Rolle (nur audit/gdpr-Perms, kein + `settings:update`) die DSGVO-/Audit-Karten gar nicht. Jede Karte + innerhalb hat ihren eigenen feingranularen Check. + */} + {(hasPermission('settings:update') || hasPermission('audit:read') || hasPermission('gdpr:admin')) && (

System