Skip to content

Permissions-Modell

Drei Ebenen

EbeneWasBeispielStatus
Rollen (Handler)Wer darf diese Aktion aufrufenaccess: { roles: ["Admin"] }✅ Gebaut
Feld-Access (Spalte)Wer darf dieses Feld sehen/schreibenaccess: { read: ["Admin"] } auf Field✅ Gebaut
Ownership (Zeile)Wer darf diese Zeile sehenaccess.read auf EntityAuth Feature

Tenant-Isolation ist immer aktiv (WHERE tenantId = …). Ownership ist der feinere Filter innerhalb eines Tenants.

Ownership: Zeilen-Filter

Optional auf der Entity-Definition. Wenn nicht definiert, sieht jeder mit Handler-Zugriff alle Zeilen seines Tenants.

r.entity("order", {
fields: {
address: { type: "text" },
revenue: { type: "number", access: { read: ["Admin", "Accounting"] } }, // Spalten-Filter
assignedUserId: { type: "number" },
teamId: { type: "number" },
},
access: {
read: {
Driver: { where: { assignedUserId: "$user.id" } }, // Nur eigene
Manager: { where: { teamId: "$user.teamId" } }, // Team
Admin: "all", // Alles
},
},
});

Was das Framework macht

RolleQuery order.listErgebnis
Driver (Max, id=7)Auto: WHERE tenantId = X AND assignedUserId = 7Nur Max’ Orders
Manager (Team 1)Auto: WHERE tenantId = X AND teamId = 1Alle Team-1 Orders
AdminAuto: WHERE tenantId = X (kein Ownership-Filter)Alle Orders

Gilt automatisch fuer: Queries, CRUD Read, Search, Export. Einmal definieren, ueberall wirksam.

$user Variablen

VariableWert
$user.idUser ID aus JWT
$user.tenantIdTenant ID aus JWT
$user.teamIdTeam ID (wenn vorhanden)
$user.rolesRollen-Array

Ohne Ownership (Default)

r.entity("product", {
fields: { ... },
// Kein access.read → jeder mit Handler-Zugriff sieht alle Produkte im Tenant
});

Boot-Validierung

PruefungFehler-Beispiel
Referenziertes Feld existiertaccess.read.Driver references "assignedUserId" but field does not exist
$user.* Variable gueltig"$user.teamId" is not a known PipelineUser property
Rolle ohne Rule und nicht “all”Role "Viewer" has handler access to "order.list" but no ownership rule — add explicit "all" or a where clause