Kairo-Jinkendo/docs/sprints/Sprint0_AP0_2_Completion_Report_v0.1.md
Lars 564008be13
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
AP0.2: Auth, Tenant, Actor Foundation mit Sessions, TenantContext und Tests.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-04 20:09:54 +02:00

5.3 KiB
Raw Blame History

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.sql
    • users — E-Mail, bcrypt-Hash, portal_role (user | admin)
    • sessions — Token, user_id, active_tenant_id, Ablauf
    • tenants — Slug, Name, aktiv
    • tenant_membershipstenant_role (owner | admin | member)
    • actorshuman, agent, working_group, external_system
    • audit_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

  1. Passwort-Policy / Rate-Limiting für Login — noch nicht implementiert.
  2. Session-Invalidierung bei Passwort-Reset (Feature kommt später).
  3. Tenant-Erstellung via API — aktuell nur Bootstrap/DB; Admin-API in späterem AP.
  4. Frontend Auth-UI — AP0.2 backend-only; SPA-Anbindung folgt.
  5. Prod-BootstrapKAIRO_BOOTSTRAP_* in Prod .env setzen 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.