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
- Permission-Katalog in der Control-DB (
permissions,app_roles,role_permissions). Scopesystemvsorg. - Builtin-Rollen:
system_admin(platform,tenant_idnull); pro Tenantorg_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. app_users.rolespeichert den Role-Code;is_system_adminbleibt synchron für Queries. Fachrollenauthority/foremanentfallen (Migration →staff).- Systemadmin ohne Impersonation: nur System-Permissions.
X-Tenant-Idallein gewährt keine Org-Data-Rechte. - Impersonation:
POST /auth/impersonate/DELETE /auth/impersonate— Systemadmin agiert als konkreter Org-Admin einer Orga (Session:user_id= Org-Admin,original_user_id= Sysadmin, Flagimpersonating_org_admin). Bei mehreren Org-Admins istuser_idPflicht; die UI zeigt einen Auswahl-Dialog. - Projektzugriff: Sichtbar nur über
project_members(Owner/Mitglied). Wermanage_projectshat, 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. - Rollen-Defaults / Locks: Admin hat alle Org-Permissions (ausgegraut). Staff hat
view_published_recordsimmer an (ausgegraut); Standard zusätzlichview_unpublished_recordsundedit_records; alles links davon wählbar. Guest standardmäßig nurview_published_records. Neue Custom-Rollen starten mit genau dieser Permission; Anlage über Dialog (Label + serialisierte Id). - Bootstrap: leere
app_users→ ein Systemadmin ausLINETRA_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_recordssind Caps für spätere Filter.