Skip to content

ADR-0053: Rollenkatalog und Systemadmin-Impersonation

  • Status: accepted
  • Datum: 2026-09-03
  • Phase: Multi-Tenant / Auth
  • Bezug: ADR-0051, ADR-0052
  • Ändert: ADR-0051 (kein role=system_admin; Sysadmin mit Org-Kontext = Org-Writer)
  • Ergänzt: 2026-09-04 — Projektzugriff wieder mitgliedschaftsbezogen; Rollen-UI Admin/Staff/Guest

Kontext

Rollen und Rechte waren hart verdrahtete Capability-Flags aus role + is_system_admin. Gewünscht sind vier Kernrollen (Systemadmin, Organisationsadmin, Mitarbeiter, Gast), ein pflegbarer Permission-Katalog, Org-eigene Zusatzrollen und ein Systemadmin, der ohne Impersonation keine Projekte/Schemata/Daten sieht.

Entscheidung

  1. Permission-Katalog in der Control-DB (permissions, app_roles, role_permissions). Scope system vs org.
  2. Builtin-Rollen: system_admin (platform, tenant_id null); pro Tenant org_admin (Anzeige Admin), staff (Staff), customer (Guest / Gast). Reihenfolge in der Matrix: Admin → Staff → Guest. Org-Admins dürfen Org-Rollen anlegen und Org-Permissions zuweisen.
  3. app_users.role speichert den Role-Code; is_system_admin bleibt synchron für Queries. Fachrollen authority / foreman entfallen (Migration → staff).
  4. Systemadmin ohne Impersonation: nur System-Permissions. X-Tenant-Id allein gewährt keine Org-Data-Rechte.
  5. Impersonation: POST /auth/impersonate / DELETE /auth/impersonate — Systemadmin agiert als konkreter Org-Admin einer Orga (Session: user_id = Org-Admin, original_user_id = Sysadmin, Flag impersonating_org_admin). Bei mehreren Org-Admins ist user_id Pflicht; die UI zeigt einen Auswahl-Dialog.
  6. Projektzugriff: Sichtbar nur über project_members (Owner/Mitglied). Wer manage_projects hat, sieht zusätzlich unclaimed Altprojekte (ohne Members), aber nicht fremde Mitgliedsprojekte. Named Schemas folgen derselben Sichtbarkeit. Org-Rechte (Admin/Staff/Guest) steuern, was ein Mitglied darf, nicht welche Projekte es sieht.
  7. Rollen-Defaults / Locks: Admin hat alle Org-Permissions (ausgegraut). Staff hat view_published_records immer an (ausgegraut); Standard zusätzlich view_unpublished_records und edit_records; alles links davon wählbar. Guest standardmäßig nur view_published_records. Neue Custom-Rollen starten mit genau dieser Permission; Anlage über Dialog (Label + serialisierte Id).
  8. Bootstrap: leere app_users → ein Systemadmin aus LINETRA_BOOTSTRAP_ADMIN_* (ohne Organisation). Organisationen inkl. Org-Admin legt der Sysadmin unter Einstellungen → Organisationen an; Org-Mitarbeiter einer gewählten Orga unter Einstellungen → Nutzer; weitere Sysadmins unter Einstellungen → Systemadministration.

Begründung

Getrennte System-/Org-Ebenen verhindern, dass Plattformoperatoren Fachdaten sehen, und erlauben Org-Admins lokale Rechte ohne Casbin. Impersonation ist der bewusste Übergang in den Org-Kontext. Mitgliedschaft bleibt die Projektgrenze (ADR-0052); Org-Admin-Rechte ersetzen keine Mitgliedschaft.

Folgen

  • Settings → Berechtigungen (System- vs. Org-Sektion).
  • Breaking: Altrollen-Codes und Sysadmin-mit-Tenant-als-Writer.
  • Breaking: Org-Admins sehen nicht mehr alle Org-Projekte allein über manage_projects.
  • Publish-Flag an Datensätzen fehlt noch; Permissions view_published_records / view_unpublished_records sind Caps für spätere Filter.