Skip to content

ADR-0052: Projektmitgliedschaft statt Org-Admin-Sicht auf alle Projekte

  • Status: accepted
  • Datum: 2026-09-02
  • Phase: Multi-Tenant / QGIS Plugin
  • Bezug: ADR-0030, ADR-0032

Kontext

Org-Admins sahen jedes Projekt der Organisation in Web und Plugin. Das Plugin importierte damit auch Projekte, die andere angelegt hatten. Gewollt ist: sichtbar nur, wer dem Projekt zugeordnet ist; GIS-Schreiben nur für Owner und Bearbeiter.

Entscheidung

  1. Tabelle project_members (user_id ohne FK auf app_users, Rolle owner | editor | reader). Genau ein Owner je Projekt.
  2. Wer ein Projekt anlegt, wird Owner.
  3. GET /projects und GET /projects/{id} nur für Mitglieder. Projekte ohne Zeilen (Altbestand) sieht ein Org-Admin, damit er sie als Owner übernehmen kann (Speichern oder Als Owner übernehmen).
  4. Owner fügt Bearbeiter und Reader hinzu (gleiche Organisation).
  5. GET /qgis/layers?project_id= setzt can_edit: Owner und Bearbeiter true, Reader false. Das Plugin zeigt nur Mitgliedsprojekte und schaltet Layer für Reader auf nur-lesen.
  6. Org-Reader mit mindestens einer Owner-/Bearbeiter-Mitgliedschaft erhalten die Postgres-Edit-Rolle in qgis_connection.

Postgres-Grants bleiben tenant-weit; die Plugin-Schicht und die API setzen die Projektgrenze. Direktes SQL mit einer Edit-Rolle umgeht sie.

Begründung

Mitgliedschaft liegt in der Tenant-DB neben projects. user_id ist eine schwache UUID wie app_users.person_id. RLS über App-User greift in QGIS nicht, weil das Plugin als {slug}_edit verbindet.

Verworfene Alternativen

Alternative Warum verworfen
Org-Admin sieht weiter alle Projekte Genau das Plugin-Problem
RLS auf geo_objects QGIS sitzt nicht als App-User in der Session
Owner = project_manager (Person) Personen sind Stammdaten, keine Web-Konten

Folgen

  • Breaking: Listen in Web und Plugin sind mitgliedschaftsbezogen.
  • Altprojekte ohne Members: Org-Admin sieht sie und kann Stammdaten speichern (wird dabei Owner). Alternativ unter Stammdaten → Projekt → Mitglieder Als Owner übernehmen.
  • Plugin muss can_edit auf GET /qgis/layers auswerten.