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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user