Zum Hauptinhalt springen

Bereiche (Scopes)

Was ein Aufruf darf, entscheiden drei Ebenen gemeinsam:

EbeneWo eingestelltWirkung
1. Obergrenze des VereinsEinstellungen → API → BereicheWas die Schnittstelle für diese Instanz insgesamt hergibt: aus / nur lesen / lesen & bearbeiten
2. Bereiche des Schlüsselsbeim Anlegen des SchlüsselsWas dieser eine Schlüssel darf
3. Der Endpunkt selbstfest in der AnwendungWelcher Bereich für diesen Aufruf nötig ist

Wirksam ist die Schnittmenge aus 1 und 2.

Token: material:write, bank:write, mails:write
Obergrenze: material = lesen & bearbeiten
bank = nur lesen
mails = aus
─────────────────────────────────────────────────────
Wirksam: material:write, bank:read
Das ist der Kern des Modells

Stellt ein Administrator einen Bereich auf nur lesen zurück, verlieren bestehende Schlüssel ihre Schreibrechte darin sofort – ohne dass jemand Schlüssel nachpflegen müsste. Genau dafür gibt es die Obergrenze.

Ein Bereich hat die Form <bereich>:read oder <bereich>:write. :write schließt :read desselben Bereichs ein – ein Werkzeug, das schreiben darf, muss nicht zusätzlich um Leserechte bitten.

Ab Werk steht jeder Bereich auf aus. Das gilt auch für Bereiche, die in einer späteren Version dazukommen: ein neuer Bereich öffnet sich nie von selbst.

Alle Bereiche

Die Spalte Interne Rechte zeigt, welche Rechte der Anwendung ein Schlüssel in diesem Bereich erhält. Ein Zugangsschlüssel ist kein Benutzerkonto, aber er soll auch keine zweite, konkurrierende Rechteverwaltung sein – deshalb bildet jeder Bereich fest auf die Einzelrechte ab, und alle vorhandenen Prüfungen greifen unverändert weiter.

BereichInhaltInterne Rechte (lesen / schreiben)
mitgliederStammdaten, Gruppenzugehörigkeit, Familien-Verknüpfungen, Gruppen-Historie, Kündigung– / contacts.manage
gruppenStufen/Gruppen und Mail-Verteiler– / contacts.manage
materialExemplare, Artikel, Sets, Kategorien, Lagerorte– / materials.write
fahrzeugeFahrzeugstammdaten– / vehicles.write
packlistenMerk-/Packlisten samt Positionen und Fahrzeugen– / packing.write
verleihAusleihen, Verfügbarkeiten, Statuswechselverleih.read / verleih.manage
veranstaltungenLager und Aktionen samt Teilnehmenden, Zahlungen und Vorlagenevents.read / events.manage, events.participants
nachweiseFührungszeugnisse und befristete Nachweise – ohne die Dateiennachweise.read / nachweise.manage
bankKonten, Buchungen, Belege samt Belegdatei, Kostenstellenbank.read / bank.manage
beitraegeSammlungen und Forderungenbank.read / bank.manage
spendenZuwendungsbestätigungen samt PDFbank.read / bank.manage
fahrtkostenFahrtkostenabrechnungen samt Fahrten und PDFbank.read / bank.manage
bescheinigungenVorlagen für Teilnahmebescheinigungen und Sonderurlaubevents.read / events.manage
abrechnungAbrechnungen, Belege, Einnahmenabrechnung.read / abrechnung.manage
kalkulationBudgetplanung, Szenarien, Positionenkalkulation.read / kalkulation.manage
mailsNachrichten, Vorlagen, Anhänge, Versandmail.send / mail.send
dokumenteOrdner und Dateien im Cloudspeicherdocuments.read / documents.write
wartelisteStufen-Wartelisten– / contacts.manage
hinweiseMeldungen auf dem Dashboard– / settings.manage
kalenderTermine aus Veranstaltungen, Packlisten und Ausleihencalendar / kein Schreibweg
stammdatenBenutzer, Rollen, Rechte, Aktivitätsprotokollusers.manage / kein Schreibweg
Ein Strich bei „lesen" heißt nicht „ohne Bereich lesbar"

Manche Bereiche haben kein eigenes internes Leserecht, weil sie in der Anwendung für jedes angemeldete Konto sichtbar sind (z. B. der Materialbestand). Ein Schlüssel braucht den Bereich material:read trotzdem – sonst wäre die Bereichsgrenze wirkungslos.

kalender und stammdaten lassen sich gar nicht auf lesen & bearbeiten stellen: Termine entstehen aus den Fachbereichen, und wer über einen Schlüssel Konten oder Rollen ändern könnte, könnte sich damit selbst mehr Rechte verschaffen, als der Schlüssel je hatte.

Endpunkte, die zwei Bereiche verlangen

Drei Endpunkte greifen über ihren eigenen Bereich hinaus. Sie brauchen beide genannten Bereiche:

EndpunktBereicheWarum
POST /spenden/{id}/als-belegspenden:write + bank:writelegt einen Beleg in der Buchhaltung an
POST /fahrtkosten/{id}/als-belegfahrtkosten:write + bank:writelegt eine Auslage in der Buchhaltung an
GET /veranstaltungen/{id}/teilnehmer/{tid}/bescheinigung/{vorlagenId}veranstaltungen:read + bescheinigungen:readverbindet Teilnahme und Vorlage

Ein Schlüssel, der nur Bestätigungen ausstellen darf, soll keine Belege in der Kasse erzeugen können.

Ein Sonderfall: POST /verleih/pruefen

Dieser Endpunkt ist ein POST, verlangt aber nur verleih:read. Er legt nichts an: Die Verfügbarkeitsprüfung ist ein Nachschlagen mit einer Eingabe, die für eine URL zu lang wäre. In der OpenAPI-Beschreibung trägt er die Markierung x-nur-lesend.

Dokumente: ein Schlüssel sieht alle Ordner

Die Freigaben je Ordner hängen an Benutzerkonten und Rollen. Ein Schlüssel hat weder das eine noch das andere – er kann also nicht „nur die freigegebenen Ordner" sehen. Ein Schlüssel mit dem Bereich dokumente sieht alle Ordner (außer den System-Ordnern der Anwendung), so wie ein Konto mit documents.manage.

Wer nur einzelne Ordner nach außen geben will, nimmt die Freigabelinks der Anwendung, nicht die Schnittstelle.

Was die Schnittstelle bewusst nicht kann

Diese Grenzen sind keine Lücken, sondern Absicht:

  • Konten, Rollen und Rechte anlegen oder ändern. Wer das über einen Schlüssel könnte, könnte sich selbst mehr Rechte verschaffen, als der Schlüssel je hatte.
  • SSO/OIDC, Zwei-Faktor, SMTP, Speicheranbindung. Dasselbe Argument: das sind die Stellschrauben der Anmeldung selbst.
  • Zugangsschlüssel verwalten. Ein Schlüssel, der sich selbst verlängern kann, hat kein Ablaufdatum.
  • Kontoauszüge importieren. Der CAMT-Import hat Dubletten-Erkennung, Saldo-Abgleich und Fehlerprotokoll; ein Dateiupload würde die halbe Mechanik umgehen.
  • SEPA-Lastschriftdateien erzeugen. Damit wird Geld eingezogen – das bleibt ein bewusster Vorgang in der Anwendung, mit der dortigen Vorschau samt übersprungenen Mandaten.
  • Nachweis-Dateien herunterladen. Dass für eine Person ein Führungszeugnis vorliegt, ist ohnehin heikel; die Datei selbst bleibt in der Anwendung.
  • Veranstaltungen, Packlisten, Dokumente und Ordner endgültig löschen. DELETE legt sie in den Papierkorb. Ein Tippfehler im Skript soll nichts unwiederbringlich vernichten.
  • Ausstellungs-Angaben ändern (Spenden, Fahrtkosten, Bescheinigungen). Lesen ja – ein Werkzeug muss den Kilometersatz kennen, um einen Betrag anzeigen zu können. Ändern nein: daran hängen Logo und Unterschrift als hochgeladene Bilder, die Nummernkreise der Bestätigungen und der Betrag, den der Verein tatsächlich auszahlt.
  • Entfernungen berechnen lassen. Der Aufruf der Anwendung fragt einen fremden Kartendienst auf Kosten des Vereins. Ein Skript in einer Schleife hätte das Tageskontingent verbraucht, bevor es jemand merkt; Kilometer lassen sich angeben.
  • Spendenbestätigungen löschen. Sie tragen eine fortlaufende Nummer und gehen an das Finanzamt. Es gibt nur den Storno mit Begründung.
  • In einem Aufruf anlegen und sofort senden (Mails). Der Versand ist bewusst der ausdrückliche zweite Schritt.

Was es (noch) nicht gibt

Kein Grundsatz, sondern schlicht nicht gebaut:

  • Mitgliederportal und Benachrichtigungen – beides hängt an einzelnen Benutzerkonten, und ein Schlüssel gehört keinem Konto.
  • Aufbewahrungsfristen und Löschlauf – der Lauf löscht endgültig und startet über die automatischen Abläufe, nicht über einen Aufruf von außen.
  • CSV-Import, gespeicherte Filter, Belegerkennung, Freigabelinks, Dashboard-Kennzahlen – Werkzeuge der Oberfläche; ihre Ergebnisse stehen über die Fachbereiche zur Verfügung.

Hat dies deine Frage beantwortet?