# Berechtigungen für Stammdatentabellen

Stammdatentabellen können in Squeeze mit einem feingranularen, rollenbasierten Berechtigungssystem geschützt werden. Damit lässt sich **pro Tabelle** und **pro Rolle** festlegen, wer die Daten einer Tabelle bearbeiten und wer die Tabelle selbst verwalten darf.

<p class="callout info">Dieses feingranulare System ist nur aktiv, wenn das Feature-Flag <code>masterDataTablePermissions</code> für den Mandanten aktiviert ist (siehe <a href="https://docs.squeeze.one/books/squeeze-2-admin-handbuch/page/features-verwalten">Features verwalten</a>). Ist das Flag deaktiviert (Standard), gelten ausschließlich die globalen Berechtigungen (siehe unten).</p>

## Zwei Berechtigungsstufen

Das System unterscheidet zwei Aktionen auf einer Stammdatentabelle. Jede ist an eine globale Berechtigung (einen *Scope*, den eine Rolle erhalten kann) gekoppelt:

<table style="width:100%;"><thead><tr><th style="width:18%;">Stufe</th><th style="width:27%;">Globale Berechtigung (Scope)</th><th style="width:55%;">Erlaubt</th></tr></thead><tbody><tr><td><strong>Verwalten</strong> (manage)</td><td><code>sqz_masterdata_manage</code></td><td>Tabellen anlegen, ändern und löschen; Spalten und Schema pflegen; die Berechtigungen der Tabelle pflegen</td></tr><tr><td><strong>Bearbeiten</strong> (edit)</td><td><code>sqz_masterdata_edit</code></td><td>Datenzeilen einer Tabelle anlegen, ändern und löschen (inkl. CSV- und Batch-Upload)</td></tr></tbody></table>

<p class="callout info">Die meisten lesenden Zugriffe (Tabellen auflisten, Spalten anzeigen, Zeilen suchen) sind <strong>nicht</strong> durch diese Berechtigungen geschützt und stehen jedem authentifizierten Benutzer offen. <strong>Ausnahme: der CSV-Export</strong> – dieser wird gesondert geprüft (siehe Abschnitt „Sonderfall: CSV-Export").</p>

## Verhalten bei deaktiviertem Feature-Flag (Standard)

Ohne aktiviertes Flag entscheidet ausschließlich die globale Berechtigung:

- Verwalten-Endpunkte erfordern den Scope `sqz_masterdata_manage`.
- Bearbeiten-Endpunkte erfordern den Scope `sqz_masterdata_edit`.

Eine tabellen- oder rollenspezifische Feinsteuerung findet nicht statt. Bereits hinterlegte Tabellen-Berechtigungen bleiben ohne Wirkung, bis das Flag aktiviert wird.

## Verhalten bei aktiviertem Feature-Flag

Ist das Flag aktiv, wird der Zugriff auf die schreibenden Endpunkte (Tabelle verwalten bzw. Daten bearbeiten) in dieser Reihenfolge entschieden:

1. **Globale Berechtigung zuerst:** Besitzt eine Rolle des Benutzers den globalen Scope (`sqz_masterdata_manage` bzw. `sqz_masterdata_edit`), ist der Zugriff auf **alle** Tabellen erlaubt. Die globale Berechtigung wirkt damit wie eine „Wildcard".
2. **Sonst tabellenspezifisch:** Andernfalls werden die für die betroffene Tabelle hinterlegten Berechtigungen geprüft. Hat der Benutzer eine Rolle, für die in dieser Tabelle das passende Recht (`canEdit` bzw. `canManage`) gesetzt ist, wird der Zugriff gewährt.
3. **Andernfalls verweigert:** Trifft nichts davon zu, wird der Zugriff mit „nicht autorisiert" (HTTP 403) abgelehnt.

Die tabellenspezifischen Berechtigungen sind also **additiv** zur globalen Berechtigung: Der globale Scope gibt Vollzugriff auf alle Tabellen, während tabellenspezifische Einträge einzelnen Rollen gezielt Rechte für einzelne Tabellen einräumen.

<p class="callout warning">Der CSV-Export folgt dieser Reihenfolge <strong>nicht</strong> – siehe den nächsten Abschnitt.</p>

## Das Tabellen-Berechtigungsobjekt

Eine tabellenspezifische Berechtigung gilt jeweils für die Kombination aus **einer Tabelle** und **einer Rolle**:

<table style="width:100%;"><thead><tr><th style="width:18%;">Feld</th><th style="width:15%;">Typ</th><th style="width:67%;">Bedeutung</th></tr></thead><tbody><tr><td><code>tableId</code></td><td>integer</td><td>ID der Stammdatentabelle</td></tr><tr><td><code>roleId</code></td><td>integer</td><td>ID der Rolle, für die die Berechtigung gilt</td></tr><tr><td><code>canEdit</code></td><td>boolean</td><td>Die Rolle darf die Datenzeilen der Tabelle bearbeiten</td></tr><tr><td><code>canManage</code></td><td>boolean</td><td>Die Rolle darf die Tabelle verwalten (Struktur, Spalten, Schema und Berechtigungen)</td></tr></tbody></table>

<p class="callout warning">Das Pflegen der Berechtigungen einer Tabelle zählt selbst zu „Verwalten". Nur wer <code>canManage</code> für die Tabelle (bzw. den globalen Scope <code>sqz_masterdata_manage</code>) besitzt, kann deren Berechtigungen ändern.</p>

## Sonderfall: CSV-Export

Der CSV-Export einer Tabelle (`GET /masterData/tables/{tableId}/csv`) wird bei aktiviertem Feature-Flag gesondert und **abweichend** von der übrigen Zugriffslogik geprüft:

- Der Export ist nur erlaubt, wenn der Benutzer eine Rolle besitzt, für die in **dieser** Tabelle eine tabellenspezifische Berechtigung mit `canEdit = true` hinterlegt ist. Andernfalls antwortet die API mit **HTTP 403**.
- Abweichend von den schreibenden Endpunkten wird hierbei der **globale Scope** `sqz_masterdata_edit` **nicht** berücksichtigt – ein rein global vergebenes Bearbeiten-Recht genügt für den CSV-Export also nicht.
- Ebenso genügt `canManage` allein **nicht**; geprüft wird ausschließlich `canEdit`.

<p class="callout warning">Erhält ein Benutzer bei aktiviertem Feature-Flag ein <strong>HTTP 403</strong> beim CSV-Export, obwohl er die Tabelle verwalten oder anderweitig darauf zugreifen kann, fehlt ihm mit hoher Wahrscheinlichkeit ein <code>canEdit</code>-Eintrag <strong>für genau diese Tabelle</strong>. Weisen Sie einer seiner Rollen eine Tabellen-Berechtigung mit <code>canEdit = true</code> zu.</p>

## Konfiguration über die API

Die tabellenspezifischen Berechtigungen werden über die REST-API gepflegt. Der Request-Body entspricht dem oben beschriebenen Objekt (`roleId`, `canEdit`, `canManage`).

**Lesen:**

- `GET /masterData/tables/{tableId}/permissions` – alle Berechtigungen einer Tabelle
- `GET /masterData/tables/{tableId}/permissions/role/{roleId}` – Berechtigung einer bestimmten Rolle
- `GET /masterData/tables/{tableId}/permissions/user/{userId}` – effektive Rechte eines Benutzers

**Schreiben (erfordert Verwalten-Recht):**

- `POST /masterData/tables/{tableId}/permissions` – Berechtigung anlegen
- `PUT /masterData/tables/{tableId}/permissions` – Berechtigung aktualisieren
- `DELETE /masterData/tables/{tableId}/permissions` – Berechtigung löschen
- `POST` / `PUT` / `DELETE /masterData/tables/{tableId}/permissions/role/{roleId}` – rollenspezifische Pflege

## Verwandte Themen

- [Features verwalten](https://docs.squeeze.one/books/squeeze-2-admin-handbuch/page/features-verwalten) – Aktivierung des Feature-Flags `masterDataTablePermissions`
- [Berechtigungskonzept](https://docs.squeeze.one/books/squeeze-2-admin-handbuch/page/berechtigungskonzept) – Gesamtüberblick der Rollen und Berechtigungen (dort als `CRUD^M` gekennzeichnet)
- [Stammdaten ab Squeeze 2.5](https://docs.squeeze.one/books/squeeze-2-admin-handbuch/page/stammdaten-ab-squeeze-25) – Grundlagen zu Stammdatentabellen