docs(15): capture phase context
This commit is contained in:
@@ -0,0 +1,264 @@
|
||||
# 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)
|
||||
Reference in New Issue
Block a user