docs(PROJ-16/21): LDAP und Multi-Tenancy aufeinander abgestimmt

- PROJ-16: Abhängigkeit zu PROJ-21 dokumentiert, Phase A (config.yml) / Phase B (pro-Mandant DB) getrennt, Rolle "admin" → "domain_admin" in group_mappings, UpsertLDAPUser erhält tenant_id in Phase B, neue /api/tenant/ldap Endpunkte
- PROJ-21: tenant_ldap-Tabelle in Phase 1 ergänzt, Phasen-Abhängigkeit zu PROJ-16 explizit, LDAP in Zugriffsmatrix aufgenommen

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sysops
2026-03-17 14:10:48 +01:00
parent 6d088795eb
commit 22dfe1300b
2 changed files with 206 additions and 4 deletions
+31 -4
View File
@@ -64,6 +64,27 @@ CREATE INDEX idx_emails_tenant ON emails(tenant_id);
ALTER TABLE audit_log ADD COLUMN tenant_id BIGINT REFERENCES tenants(id);
```
### Neue Tabelle: `tenant_ldap` (PROJ-16 Phase B)
Ermöglicht pro-Mandant-LDAP-Konfiguration durch Domain-Admins ohne `config.yml`-Zugriff.
Wird in Phase 1 als leere Tabelle angelegt; befüllt durch PROJ-16 Phase B.
```sql
CREATE TABLE tenant_ldap (
tenant_id BIGINT PRIMARY KEY REFERENCES tenants(id) ON DELETE CASCADE,
enabled BOOLEAN NOT NULL DEFAULT false,
url TEXT NOT NULL DEFAULT '',
bind_dn TEXT NOT NULL DEFAULT '',
bind_password BYTEA, -- AES-256-GCM verschlüsselt
base_dn TEXT NOT NULL DEFAULT '',
user_filter TEXT NOT NULL DEFAULT '(sAMAccountName=%s)',
tls BOOLEAN NOT NULL DEFAULT false,
tls_skip_verify BOOLEAN NOT NULL DEFAULT false,
default_role VARCHAR(20) NOT NULL DEFAULT 'user',
group_mappings JSONB -- [{group_dn, role}, ...]
);
```
### Xapian-Index
Jeder Mandant bekommt ein **eigenes Xapian-Verzeichnis**:
@@ -164,6 +185,8 @@ JWT-Claims erweitern:
| Mandanten verwalten | ✓ | — | — | — |
| Eigene Nutzer verwalten | ✓ | ✓ | — | — |
| Eigene Domains verwalten | ✓ | ✓ | — | — |
| LDAP konfigurieren (eigener Mandant) | ✓ | ✓ | — | — |
| LDAP konfigurieren (alle Mandanten) | ✓ | — | — | — |
| E-Mails lesen (eigener Mandant) | ✓ | ✓ | ✓ | ✓ |
| E-Mails anderer Mandanten | ✓ | — | — | — |
| Audit-Log (eigener Mandant) | ✓ | ✓ | ✓ | — |
@@ -230,15 +253,19 @@ Domain-Lookup: SELECT tenant_id FROM tenant_domains WHERE domain = 'mustermann.d
| Phase | Inhalt | Abhängigkeit |
|---|---|---|
| **Phase 1** | DB-Schema: `tenants`, `tenant_domains`, Migration | — |
| **Phase 2** | `userstore` + `storage` tenant-aware, JWT erweitern | Phase 1 |
| **Phase 1** | DB-Schema: `tenants`, `tenant_domains`, `tenant_ldap` (leer), Migration | — |
| **Phase 2** | `userstore` + `storage` tenant-aware, JWT erweitern, `UpsertLDAPUser` + `tenant_id` | Phase 1 |
| **Phase 3** | API-Middleware + alle bestehenden Handler tenant-gefiltert | Phase 2 |
| **Phase 4** | Xapian: pro-Tenant-Index, Index-Manager | Phase 2 |
| **Phase 5** | SMTP: Domain → Tenant-Routing | Phase 1 |
| **Phase 6** | Neue API-Routen (Tenant-Management) | Phase 3 |
| **Phase 7** | Frontend: superadmin-UI, domain_admin-Beschränkungen | Phase 6 |
| **Phase 6** | Neue API-Routen (Tenant-Management + `/api/tenant/ldap`) | Phase 3 |
| **Phase 7** | Frontend: superadmin-UI, domain_admin-Beschränkungen, LDAP-Konfig-Tab | Phase 6 |
| **Phase 8** | Migrations-Script + CLI-Befehl `archivmail migrate-tenants` | alle |
> **PROJ-16 Abhängigkeit:**
> - PROJ-16 Phase A (Single-Tenant-LDAP via `config.yml`) ist unabhängig von PROJ-21 umsetzbar.
> - PROJ-16 Phase B (Pro-Mandant-LDAP, `tenant_ldap`-Tabelle, Domain-Admin-UI) **erfordert PROJ-21 Phase 2+6** als Voraussetzung.
---
## Offene Entscheidungen (vor Implementierung klären)