RBAC
Monozu Cloud uses group-based RBAC. Every user belongs to one or more groups; each group has a set of permissions drawn from a central catalog. The backend enforces these permissions on every protected endpoint.
graph LR
User --> Group1["Group (e.g. IT Admin)"]
User --> Group2["Group (e.g. Security Analyst)"]
Group1 --> P1["incidents:read"]
Group1 --> P2["incidents:create"]
Group1 --> P3["assets:read"]
Group2 --> P4["security:read"]
Group2 --> P5["incidents:read"]
Group2 --> P6["vulnerabilities:read"]
A user’s effective permission set is the union of all permissions from all their groups. Permissions are checked before the domain handler runs.
Permission catalog
Section titled “Permission catalog”All available permissions are defined in Backend/internal/rbac/catalog.go. They follow the pattern <resource>:<action>:
CMDB / Assets
assets:read,assets:create,assets:update,assets:deletesites:read,sites:create,sites:update,sites:deletevendors:read,vendors:create,vendors:update,vendors:delete
ITSM
incidents:read,incidents:create,incidents:update,incidents:deleteproblems:read,problems:create,problems:update,problems:deletechanges:read,changes:create,changes:update,changes:deleteservice-requests:read,service-requests:create,service-requests:updatereleases:read,releases:create,releases:updatemaintenance:read,maintenance:create,maintenance:update
Knowledge
knowledge:read,knowledge:create,knowledge:update,knowledge:deletediagrams:read,diagrams:create,diagrams:update,diagrams:delete
Security (optional module)
security:read,security:managecompliance:read,compliance:managevulnerabilities:read,vulnerabilities:manage
VPN (optional module)
vpn:read,vpn:manage
Backup (optional module)
backup:read,backup:manage
Settings
settings:read,settings:manageusers:read,users:invite,users:managerbac:read,rbac:manageaudit:read
Consult
Backend/internal/rbac/catalog.gofor the authoritative and up-to-date list.
Backend enforcement
Section titled “Backend enforcement”The RequirePermission middleware is applied at route registration time in Backend/internal/app/register_*.go:
// Example (illustrative — not actual code)incidents.Get("/", RequirePermission("incidents:read"), handler.ListIncidents)incidents.Post("/", RequirePermission("incidents:create"), handler.CreateIncident)The middleware:
- Extracts the user ID from the validated JWT
- Loads the user’s groups from the database (or a short-lived cache)
- Resolves the union of group permissions
- Returns
403 Forbiddenif the required permission is not present
Frontend enforcement
Section titled “Frontend enforcement”The frontend hides navigation items and routes based on the user’s permissions. The user object returned from GET /api/v1/me includes the resolved permission set. React components and route guards check this set before rendering protected UI.
Key files:
Frontend/src/components/Sidebar.tsx— hides nav items by permissionFrontend/src/routes/ProtectedRoute.tsx— redirects to/403if permission missingFrontend/lib/stores/authStore.ts— stores user + permissions in Zustand
Group management
Section titled “Group management”Tenant administrators manage groups and assign permissions in Settings → Groups. The available permissions shown in the settings UI come from the backend catalog endpoint GET /api/v1/settings/rbac/permissions.