Appendices 12
Permission Reference
Every permission key, which page it opens, and which button it reveals.
1. How a permission key is written
<resource>:<action>| Action | Letter | Meaning |
|---|---|---|
| Create | C | Create new records |
| Read | R | View lists and details |
| Update | U | Modify, activate, deactivate |
| Delete | D | Delete records |
The catalogue holds exactly 42 permissions across 12 resources, and the set is fixed — Merak does not mint new permissions at runtime. Ten resources carry the full C/R/U/D set; permission and auditLog are read-only and exist solely as permission:R and auditLog:R (10 × 4 + 2 = 42).
| Resource | Key | Governs |
|---|---|---|
| User | user | Console administrator accounts |
| Member | member | Managed people |
| Device | device | Devices registered to members |
| Application | application | Published services |
| Organization | organization | Groups of members and applications |
| Role | role | Roles |
| Permission | permission | The permission catalogue itself |
| Token request | tokenRequest | Approvals |
| Audit log | auditLog | Audit log and connection log |
| Tenant | tenant | Tenant information |
| License | license | Licence and quota information |
| Merak Node | merakNode | Edge routing nodes |
2. Page access matrix
Holding the listed permission is what makes the menu entry appear and the route open. Without it, the menu entry is hidden and typing the URL shows a “no access” result.
| Page | Route | Required |
|---|---|---|
| Dashboard | / | none |
| Members | /member | member:R |
| Applications | /application | application:R |
| Organizations | /organization | organization:R |
| Merak Nodes | /meraknode | merakNode:R |
| Approvals | /approve | tokenRequest:R |
| Audit Log | /audit-log | auditLog:R |
| Connection Log | /connection-log | auditLog:R |
| Users (admins) | /user | user:R |
| Roles | /role | role:R |
| Profile | /profile | none |
| Preferences | /preference | none |
A menu group disappears when every one of its children is hidden.
3. Action matrix by resource
3.1 Members
| Action | Permission |
|---|---|
| View list and detail | member:R |
| Create / copy / import | member:C |
| Edit | member:U |
| Deactivate / Unactivate / Unlock / Start / Send Email / Reset MFA | member:U |
| Delete | member:D |
Cross-feature: the Devices card needs device:R, Organizations organization:R, Applications application:R, the Log tab auditLog:R. Losing one hides that card or tab entirely.
3.2 Devices
| Action | Permission |
|---|---|
| View devices | device:R |
| Rename / deactivate | device:U |
| Delete | device:D |
3.3 Applications
| Action | Permission |
|---|---|
| View list and detail | application:R |
| Create / copy / import | application:C |
| Edit, activate, deactivate | application:U |
| Delete | application:D |
| Edit member access | application:U + member:R + member:U |
| Edit organization access | application:U + organization:R + organization:U |
| See the Members card | member:R |
| See the Organizations card | organization:R |
| Filter by organization | organization:R |
| Add a member node in the topology chart | member:R |
3.4 Organizations
| Action | Permission |
|---|---|
| View list and detail | organization:R |
| Create / copy / import | organization:C |
| Edit name and description | organization:U |
| Add or remove members / applications | organization:U |
| Delete | organization:D |
| See the Members card and filter | member:R |
| See the Applications card and filter | application:R |
3.5 Merak Nodes
| Action | Permission |
|---|---|
| View list and detail | merakNode:R — gates the page |
| Create | merakNode:C — enforced by the backend only |
| Rename, regenerate JWT | merakNode:U — enforced by the backend only |
| Delete | merakNode:D — enforced by the backend only |
⚠️ Merak Nodes are the one exception to “missing permission = missing button”. The Console gates the page on
merakNode:R, but the create, rename, regenerate and delete controls are shown to anyone who can open the page — they are filtered by deployment status only. ThemerakNode:C/U/Dkeys exist and the backend applies them, so an action you are not entitled to fails at submit rather than being hidden. Treat a visible button here as “you may try”, not “you may do”.
3.6 Approvals
| Action | Permission |
|---|---|
| Open the page, see the queue | tokenRequest:R |
| Approve or reject (single or batch) | tokenRequest:U |
3.7 Logs
| Action | Permission |
|---|---|
| Audit log: view, filter, export | auditLog:R |
| Connection log: view, filter, export | auditLog:R |
| A member’s or user’s Log tab | auditLog:R |
3.8 Users (Console administrators)
| Action | Permission |
|---|---|
| View list and detail | user:R |
| Create / copy / import | user:C |
| Edit / Deactivate / Activate / Unlock / Resend activation mail / Reset MFA | user:U |
| Delete | user:D |
| Edit the role field | user:U and role:U |
| Validate a role selection | permission:R |
3.9 Roles
| Action | Permission |
|---|---|
| View list and detail | role:R |
| Create / copy / import | role:C |
| Edit name and description | role:U |
| Delete | role:D |
| Add or remove a role’s permissions | role:U + permission:R |
3.10 Profile and Preferences
| Action | Permission |
|---|---|
| Open both pages | none |
| Edit your own name, password, MFA | none |
| See tenant information | tenant:R — degrades to - without it |
| See licence and quota | license:R — degrades to a notice without it |
4. Rules that apply everywhere
4.1 Missing permission = missing button
A control you have no permission for is not rendered, not disabled. If a button you expect is absent, check the permission before you file a bug.
One exception: Merak Nodes. Its create, rename, regenerate and delete controls are not permission-filtered in the Console — only the page is. See §3.5.
4.2 Cross-feature dependencies hide whole sections
When a page needs another resource’s data, losing that resource’s read permission removes the whole card, tab or filter field — Merak does not show an empty card you could mistake for “there is nothing here”. It also stops asking the server for data you may not read.
4.3 Both sides are needed to grant access
Granting access writes to two records, so it needs permission on both:
| Grant | Needs |
|---|---|
| Application → members | application:U + member:R + member:U |
| Application → organizations | application:U + organization:R + organization:U |
| User → roles | user:U + role:U |
A field you cannot fully edit becomes read-only and submits as empty — it never smuggles a pre-ticked seed value past your permissions.
Read-only pickers used purely to find a source (the organization option in the quick-select pickers) need only that resource’s read permission, because nothing is written to it.
4.4 You can never grant what you do not hold
Enforced in four places — copying a user, copying a role, assigning a role manually, and importing roles. All of them fail closed: if the check cannot be completed, the grant is refused rather than allowed through unverified. See 08 · Administrators & Roles §11.
4.5 Every default role carries tenant:R and license:R
That is why tenant name and quota normally work. An account with no roles at all may still be refused, and every screen that reads them degrades gracefully rather than failing.
5. System accounts and system roles
| Thing | Protection |
|---|---|
| System role | Cannot be edited or deleted. Can be viewed and copied — a copy only reads the source and produces a new ordinary role. |
| System user | Marked with a System chip in the list. |
Batch delete on roles excludes system roles from the eligible set up front, rather than letting each one fail against the server.