You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: content/docs/permissions/permissions-matrix.mdx
+9Lines changed: 9 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -23,6 +23,7 @@ ObjectStack's `ObjectPermission` schema defines these boolean flags for object a
23
23
|**Create**|`allowCreate`| Create new records | Insert records |
24
24
|**Edit**|`allowEdit`| Modify records owned by the user or shared with them | Edit own records |
25
25
|**Delete**|`allowDelete`| Remove records owned by the user or shared with them | Delete own records |
26
+
|**Export**|`allowExport`| Take a bulk machine-readable copy of the records the user can read | Export / bulk egress ([details](/docs/permissions/permission-sets#allowexport--the-export-axis)) |
26
27
|**Transfer**|`allowTransfer`| Change record ownership | Reassign owner |
27
28
|**Restore**|`allowRestore`| Undelete from trash | Recover soft-deleted records |
@@ -32,6 +33,14 @@ ObjectStack's `ObjectPermission` schema defines these boolean flags for object a
32
33
<Callouttype="tip">
33
34
**Super-user bypass:** When `modifyAllRecords` is set it satisfies write checks (`allowEdit`/`allowDelete`, and the lifecycle class `allowTransfer`/`allowRestore`/`allowPurge`) on any record; `viewAllRecords` (or `modifyAllRecords`) satisfies `allowRead` on any record — both bypass ownership and sharing. See `packages/plugins/plugin-security/src/permission-evaluator.ts`.
34
35
36
+
**The one exception is `allowExport`.** Neither super-user bit confers it: a
37
+
principal with View/Modify All Data may read every record and still be refused a
38
+
bulk copy of them. Export is an opt-in grant that must be stated explicitly —
39
+
separating "may see all data" from "may take a bulk copy of it" is the
40
+
segregation-of-duties case the axis exists for. The built-in
|**allowExport**|`boolean`| optional |[#3544] User-level export axis over read (opt-in grant). true = export granted (still bounded by read); unset/false = no export. Merged most-permissively like the CRUD bits; NOT implied by viewAllRecords/modifyAllRecords. |
63
63
|**allowTransfer**|`boolean`| ✅ |[RBAC-gated; ENFORCED now via insert/update owner_id guard, #3004] Change record ownership (assign/reassign/disown owner_id) |
|**allowExport**|`boolean`| optional |[#3544] User-level export axis over read (opt-in grant). true = export granted (still bounded by read); unset/false = no export. Merged most-permissively like the CRUD bits; NOT implied by viewAllRecords/modifyAllRecords. |
111
111
|**allowTransfer**|`boolean`| ✅ |[RBAC-gated; ENFORCED now via insert/update owner_id guard, #3004] Change record ownership (assign/reassign/disown owner_id) |
0 commit comments