265 lines
10 KiB
Markdown
265 lines
10 KiB
Markdown
# Phase 15: Modul-Berechtigungen: Gruppen & User-Grants - Discussion Log
|
||
|
||
> **Audit trail only.** Do not use as input to planning, research, or execution agents.
|
||
> Decisions are captured in CONTEXT.md — this log preserves the alternatives considered.
|
||
|
||
**Date:** 2026-08-04
|
||
**Phase:** 15-modul-berechtigungen-gruppen-user-grants
|
||
**Areas discussed:** Grundsatzentscheidungen (vor Roadmap-Eintrag), Sperr-Verhalten im Portal, Standard-Zuweisungen, Admin-UI Ort & Form, AD-Bindung & Sync-Semantik, Nachfragen (Widgets, Löschen, Protokoll)
|
||
|
||
---
|
||
|
||
## Grundsatzentscheidungen (vor dem Roadmap-Eintrag geklärt)
|
||
|
||
### Herkunft der Gruppen
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Beides: Tessera-Gruppen mit optionaler AD-Bindung | Group-Model mit manuellen Mitgliedern, optional ldapDn — deckt Mandanten mit und ohne AD ab | ✓ |
|
||
| Nur Tessera-eigene Gruppen | Ausschließlich im Admin-UI gepflegt, kein memberOf-Sync | |
|
||
| Nur AD-Gruppen | Gruppen 1:1 aus dem AD, kein manuelles Anlegen | |
|
||
|
||
**User's choice:** Tessera-Gruppen mit optionaler AD-Bindung
|
||
|
||
### Default ohne Freigabe
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Offen, Einschränkung pro Modul aktivierbar | Ohne Grants sehen alle Nutzer des Mandanten das Modul (heutiges Verhalten) | |
|
||
| Geschlossen — Freigabe immer nötig | Tenant-Aktivierung ist nur Voraussetzung, jeder User braucht Grant | ✓ |
|
||
|
||
**User's choice:** Geschlossen
|
||
**Notes:** Lockout-Risiko wurde benannt; die Migration mit Gruppe „Alle Benutzer" wurde als Gegenmaßnahme vereinbart.
|
||
|
||
### Admin-Bypass
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| ADMIN + SUPER_ADMIN sehen alles Aktive | Admins umgehen Grants im eigenen Mandanten | ✓ |
|
||
| Nur SUPER_ADMIN umgeht | Mandanten-Admins unterliegen selbst den Grants | |
|
||
| Niemand umgeht | Grants gelten für alle | |
|
||
|
||
**User's choice:** ADMIN + SUPER_ADMIN
|
||
|
||
### Tiefe der Berechtigung
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Nur Modul-Zugriff (an/aus) | Grant entscheidet nur über Sichtbarkeit und API-Nutzung | ✓ |
|
||
| Zugriff + Rechtestufen pro Modul | Zusätzlich read/write/admin je Grant, von jedem Modul auszuwerten | |
|
||
|
||
**User's choice:** Nur Zugriff an/aus
|
||
|
||
---
|
||
|
||
## Sperr-Verhalten im Portal
|
||
|
||
### Direktaufruf einer nicht freigegebenen Modul-URL
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| 403-Seite mit Hinweis | „Kein Zugriff — wende dich an deinen Administrator" | ✓ |
|
||
| Weiterleitung aufs Dashboard | Stiller Redirect ohne Meldung | |
|
||
| 404 — Existenz verbergen | Verrät nichts über vorhandene Module, erschwert Support | |
|
||
|
||
**User's choice:** 403-Seite mit Hinweis
|
||
|
||
### Sichtbarkeit im Marketplace
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Sichtbar mit Badge „Kein Zugriff" | Katalog bleibt vollständig, gesperrte Module gekennzeichnet | ✓ |
|
||
| Komplett ausblenden | Marketplace zeigt nur Nutzbares | |
|
||
| Nur für Admins gefiltert | Gleiche Filterung wie Sidebar, ohne Sonderdarstellung | |
|
||
|
||
**User's choice:** Sichtbar mit Badge
|
||
|
||
### Wirksamkeit eines Entzugs bei aktiver Session
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Beim nächsten Seitenaufruf | API sperrt sofort, Sidebar zieht beim Laden nach | ✓ |
|
||
| Sidebar pollt regelmäßig | Entzug wird ohne Reload sichtbar, kostet Extra-Last | |
|
||
|
||
**User's choice:** Beim nächsten Seitenaufruf
|
||
|
||
---
|
||
|
||
## Standard-Zuweisungen
|
||
|
||
### Freigabe-Default beim Aktivieren eines Moduls
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Automatisch für „Alle Benutzer" | Aktivieren genügt, Einschränkung nachträglich | |
|
||
| Zunächst niemand außer Admins | Jede Freigabe ist ein bewusster zweiter Schritt | |
|
||
| Admin wird beim Aktivieren gefragt | Dialog: sofort freigeben oder erst konfigurieren | ✓ |
|
||
|
||
**User's choice:** Dialog beim Aktivieren
|
||
**Notes:** Der bisher einfache Aktiv-Toggle in /admin/modules bekommt damit eine Rückfrage.
|
||
|
||
### Neu angelegter Benutzer
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Ja, automatisch in die Standardgruppe | Neue Benutzer sofort arbeitsfähig | ✓ |
|
||
| Nein, ohne Gruppe starten | Admin weist bewusst zu | |
|
||
| Checkbox im Anlegen-Formular | Vorbelegt auf ja, abwählbar | |
|
||
|
||
**User's choice:** Automatisch
|
||
|
||
### Per LDAP importierter Benutzer
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Genauso wie manuell angelegte | Eine Regel für beide Herkünfte | ✓ |
|
||
| Nur über AD-gebundene Gruppen | Ausschließlich Mitgliedschaften aus dem AD | |
|
||
|
||
**User's choice:** Genauso wie manuell angelegte
|
||
|
||
### Status der Gruppe „Alle Benutzer"
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Geschützte Systemgruppe | Nicht löschbar, nicht umbenennbar | |
|
||
| Ganz normale Gruppe | Frei bearbeitbar, umbenennbar, löschbar | ✓ |
|
||
|
||
**User's choice:** Normale Gruppe
|
||
**Notes:** Diese Wahl warf die Folgefrage auf, wie der Automatismus aus D-11/D-12 sein Ziel findet — beantwortet über die Markierung „Standardgruppe" (D-13).
|
||
|
||
---
|
||
|
||
## Admin-UI: Ort & Form
|
||
|
||
### Ort der Gruppenverwaltung
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Eigener Punkt /admin/groups | Sechster Eintrag neben den bestehenden Admin-Seiten | ✓ |
|
||
| Als Tab in /admin/users | Benutzer und Gruppen auf einer Seite | |
|
||
|
||
**User's choice:** Eigener Punkt /admin/groups
|
||
|
||
### Ort der Freigabe-Matrix
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Eigene Matrix-Seite | Tabelle Module × Gruppen, gesamter Stand auf einen Blick | ✓ |
|
||
| Pro Modul in /admin/modules | Aufklappbare Freigabeliste je Modul | |
|
||
| Pro Gruppe in der Gruppenverwaltung | Modulliste zum Ankreuzen je Gruppe | |
|
||
|
||
**User's choice:** Eigene Matrix-Seite
|
||
|
||
### Einzel-Freigaben für Benutzer
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Beim Benutzer in /admin/users | Sektion „Zusätzliche Modulfreigaben" plus geerbte Rechte | ✓ |
|
||
| In derselben Matrix wie Gruppen | Benutzer als zusätzliche Spalten | |
|
||
| Nur über Gruppen — keine Einzelfreigaben | Reduktion des Phasenziels | |
|
||
|
||
**User's choice:** Beim Benutzer in /admin/users
|
||
|
||
### Ziel des Auto-Beitritts
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Markierung „Standardgruppe" | Genau eine Gruppe pro Mandant, umhängbar und abschaltbar | ✓ |
|
||
| Fest an den Namen „Alle Benutzer" gebunden | Bricht still beim Umbenennen | |
|
||
| Gar kein Automatismus | Widerspricht D-11/D-12 | |
|
||
|
||
**User's choice:** Markierung „Standardgruppe"
|
||
|
||
---
|
||
|
||
## AD-Bindung & Sync-Semantik
|
||
|
||
### Auswahl der AD-Gruppe
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Aus dem AD browsen | Bestehende Gruppensuche im LDAP-Service wiederverwenden | ✓ |
|
||
| DN manuell eintippen | Einfaches Textfeld, verlangt exakte DN-Kenntnis | |
|
||
| Browsen mit manueller Korrektur | Liste plus editierbares Feld | |
|
||
|
||
**User's choice:** Aus dem AD browsen
|
||
|
||
### Benutzer verlässt die AD-Gruppe
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Mitgliedschaft entfernen | Nur die LDAP-Mitgliedschaft fällt weg, manuelle bleiben | ✓ |
|
||
| Behalten und markieren | Bleibt bestehen, wird als „nicht mehr im AD" gekennzeichnet | |
|
||
|
||
**User's choice:** Mitgliedschaft entfernen
|
||
|
||
### Manuelle Mitglieder in gebundenen Gruppen
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Ja, beide Quellen nebeneinander | Mitgliedschaft merkt sich Herkunft MANUAL/LDAP | ✓ |
|
||
| Nein, gebundene Gruppen sind reine AD-Spiegel | Jede Ausnahme braucht eine zweite Gruppe | |
|
||
|
||
**User's choice:** Beide Quellen nebeneinander
|
||
|
||
### Zeitpunkt des Gruppen-Syncs
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Immer mit dem Benutzer-Sync | memberOf im selben Durchlauf, ein Vorgang | ✓ |
|
||
| Eigener Gruppen-Sync-Button | Getrennte Auslösung, zwei Stände | |
|
||
|
||
**User's choice:** Immer mit dem Benutzer-Sync
|
||
|
||
---
|
||
|
||
## Nachfragen: Widgets, Löschen, Protokoll
|
||
|
||
### Widgets gesperrter Module
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Nein — außerhalb dieser Phase | Widgets sind heute modulunabhängig, Zuordnung wäre neue Fähigkeit | |
|
||
| Ja — Zuordnung mitbauen | Widget-Typen bekommen Modul-Bezug, gesperrte Widgets verschwinden | ✓ |
|
||
|
||
**User's choice:** Zuordnung mitbauen
|
||
**Notes:** Erweitert die Phase gegenüber den ursprünglichen sechs Success Criteria der Roadmap um Schema, Migration und Dashboard-Logik.
|
||
|
||
### Löschen einer belegten Gruppe
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Warnung mit Zahlen, dann kaskadieren | Dialog nennt Mitglieder- und Freigabenanzahl | ✓ |
|
||
| Kommentarlos kaskadieren | Ohne Rückfrage | |
|
||
| Löschen sperren, solange belegt | Gruppe muss erst geleert werden | |
|
||
|
||
**User's choice:** Warnung mit Zahlen, dann kaskadieren
|
||
|
||
### Protokollierung von Freigabeänderungen
|
||
|
||
| Option | Description | Selected |
|
||
|--------|-------------|----------|
|
||
| Ja, in der Datenbank mit Anzeige | Eigene Tabelle, im Admin-UI einsehbar | |
|
||
| Nur ins Server-Log | Kein DB-Eintrag, keine UI-Ansicht | ✓ |
|
||
| Vorerst gar nicht | Kein Protokoll in dieser Phase | |
|
||
|
||
**User's choice:** Nur ins Server-Log
|
||
|
||
---
|
||
|
||
## Claude's Discretion
|
||
|
||
- Schema-Details der neuen Modelle (Feldnamen, Indizes, Kaskaden, Erzwingung der Entweder-oder-Beziehung bei ModuleGrant)
|
||
- Aufbau und Ort der Zugriffsauflösung im NestJS-Code, inklusive etwaigem Request-Caching
|
||
- Migrationstechnik: Prisma-Migration mit Datenschritt oder separates Seed-Skript
|
||
- Darstellung der Matrix bei vielen Modulen und Gruppen
|
||
- Namensraum und Schnitt der i18n-Keys
|
||
- Mechanik der Widget-Typ-→-Modul-Zuordnung (statische Registrierung oder DB-Feld)
|
||
|
||
## Deferred Ideas
|
||
|
||
- Rechtestufen innerhalb eines Moduls (read/write/admin pro Grant)
|
||
- Self-Service „Zugriff anfragen" aus dem Marketplace inklusive Genehmigungsfluss
|
||
- Audit-Trail für Berechtigungsänderungen in der Datenbank mit Ansicht im Admin-UI
|
||
- Mehrfach-Mandantenzugehörigkeit eines Benutzers (offen seit Phase 2, D-09)
|