Some checks failed
Deploy Development / deploy (push) Successful in 38s
Test Suite / pytest-backend (push) Failing after 7s
Test Suite / k6 /api/health Baseline (push) Has been skipped
Test Suite / playwright-smoke (push) Has been skipped
Test Suite / lint-backend (push) Successful in 2s
Test Suite / compose-smoke (push) Has been skipped
Co-authored-by: Cursor <cursoragent@cursor.com>
5.3 KiB
5.3 KiB
AP0.2 – Abschlussbericht Auth, Identity, Tenant & Actor Foundation
Status: abgeschlossen (Implementierung)
Stand: 2026-07-04
Branch: develop (noch nicht auf main gemergt)
1. Umgesetzte Dateien
| Datei | Zweck |
|---|---|
backend/migrations/002_auth_identity_tenant_actor.sql |
Schema User, Session, Tenant, Membership, Actor, Audit |
backend/auth.py |
bcrypt, Sessions, login/logout, require_auth, require_portal_admin |
backend/tenant_context.py |
TenantContext, get_tenant_context, require_tenant_context |
backend/bootstrap.py |
Env-basierter Admin/Tenant/ Actor-Seed |
backend/services/audit.py |
Audit-Log für Auth-Aktionen |
backend/services/actors.py |
Actor-Erzeugung + Human-Lookup |
backend/routers/auth.py |
Login/Logout |
backend/routers/me.py |
/api/me, /api/me/context, Tenant-Wechsel |
backend/main.py |
Router, Bootstrap nach Migrationen |
backend/tests/conftest.py |
DB-Fixtures |
backend/tests/factories.py |
Testdaten |
backend/tests/test_auth.py |
Login, Logout, Session, Context |
backend/tests/test_tenant_actor.py |
Actor-Typen, Rollen-Trennung |
backend/version.py |
0.2.0-ap0.2, Schema 002 |
docker-compose.dev-env.yml, docker-compose.yml |
Bootstrap/Session-Env |
.env.example, README.md |
Doku |
2. Neue Migrationen
002_auth_identity_tenant_actor.sqlusers— E-Mail, bcrypt-Hash,portal_role(user|admin)sessions— Token,user_id,active_tenant_id, Ablauftenants— Slug, Name, aktivtenant_memberships—tenant_role(owner|admin|member)actors—human,agent,working_group,external_systemaudit_log— Auth-Ereignisse
3. Neue Endpoints
| Endpoint | Methode | Auth |
|---|---|---|
/api/auth/login |
POST | — |
/api/auth/logout |
POST | X-Auth-Token |
/api/me |
GET | X-Auth-Token |
/api/me/context |
GET | X-Auth-Token |
/api/me/context/required |
GET | X-Auth-Token + aktiver Tenant |
/api/me/tenant |
POST | X-Auth-Token |
OpenAPI: /api/docs (Dev)
4. Auth-Fluss
POST /api/auth/login { email, password }
→ bcrypt verify
→ INSERT sessions (opaque token, expires_at, active_tenant_id = erste Membership)
→ audit: auth.login
→ Response: { token, expires_at, user }
Request mit Header X-Auth-Token
→ get_session(token) JOIN users
→ require_auth → session dict (user_id aus DB, nie aus Client-Header)
POST /api/auth/logout
→ DELETE session
→ audit: auth.logout
5. TenantContext-Auflösung
require_auth → session (user_id, active_tenant_id, portal_role, …)
→ tenant_memberships + tenants prüfen (nur aktive)
→ human actor: actors WHERE tenant_id + user_id + type=human
→ TenantContext(
portal_role, # Plattform
tenant_role, # Mandant
tenant_id/slug/name,
actor_id/type
)
Tenant-Wechsel: POST /api/me/tenant aktualisiert sessions.active_tenant_id nur bei gültiger Membership.
6. Tests und Testergebnis
| Testdatei | Abdeckung |
|---|---|
test_auth.py |
Login, Logout, Session ungültig, /api/me, Context, Tenant-Wechsel verweigert |
test_tenant_actor.py |
Human↔User, Agent/WG/External ohne User, Portal- vs. Tenant-Rolle |
test_migrations.py |
Migration 002 erkannt + idempotent |
Lokal ausführen (Backend-Container):
docker compose -f docker-compose.dev-env.yml exec backend pip install -r requirements-dev.txt
docker compose -f docker-compose.dev-env.yml exec backend python -m pytest tests -ra -vv
(In dieser Session kein Docker lokal — Verifikation über CI nach Push auf develop.)
7. Abweichungen von den Designprinzipien
| Prinzip | Abweichung | Begründung |
|---|---|---|
Mitai profiles |
Kairo nutzt users |
Klarere Trennung User ≠ Actor; kein Multi-Profil-Legacy |
| Legacy SHA256-Upgrade | nur bcrypt | Grüne Wiese AP0.2 |
require_auth_flexible (Query-Token) |
nicht implementiert | Nicht AP0.2-Scope; SSE/Download später |
| Account-Lifecycle-Gates | fehlen | AP0.3+ |
| Capabilities in TenantContext | leer / nicht modelliert | Bewusst Nicht-Scope |
Eingehalten: Server-Sessions, X-Auth-Token, Depends(require_auth) separat, user_id aus Session, Portal- vs. Tenant-Rolle getrennt, TenantContext als eigene Schicht.
8. Offene Entscheidungen
- Passwort-Policy / Rate-Limiting für Login — noch nicht implementiert.
- Session-Invalidierung bei Passwort-Reset (Feature kommt später).
- Tenant-Erstellung via API — aktuell nur Bootstrap/DB; Admin-API in späterem AP.
- Frontend Auth-UI — AP0.2 backend-only; SPA-Anbindung folgt.
- Prod-Bootstrap —
KAIRO_BOOTSTRAP_*in Prod.envsetzen oder einmalig manuell seeden.
9. Empfehlung für AP0.3
Laut Foundation-Dokument ursprünglich „Capabilities & Rights Registry“ — der User-Auftrag kombinierte Auth+Tenant bereits in AP0.2.
AP0.3 Vorschlag:
- Capability/Rights Registry (DB + Sync)
require_capability()Dependency- TenantContext um
capabilities: list[str]erweitern - Keine Feature-Limits / Billing
- Optional: Frontend Login-Form + Token-Speicherung
Erstellt im Rahmen Sprint 0 – AP0.2.