Users, roles & permissions
Access control in MintJams CMS is built from users, groups and roles (principals) and the ACLs granted on nodes. Identity is managed globally in the system workspace and shared across all workspaces.
Two ways to manage it
| Method | Use it for |
|---|---|
| Identity Manager (app) | interactive management from the UI; day-to-day creation, edits, passwords |
| Provisioning (YAML) | declarative, reproducible seeding; the initial set shipped with an app |
Both write to the same model, so the accounts they create are indistinguishable. See "Identity Manager" and "Provisioning".
Principals
- Users —
/home/users/{id}. Accounts that can sign in interactively - Groups —
/home/groups/{id}. Bundle members and serve as the unit of permission grants - Roles —
/home/roles/{id}. Bundles of permissions - Service accounts — non-interactive identities with no password, used by integrations via
runAs; they cannot sign in
Groups and roles can be hierarchical. Membership has both direct and effective (including ancestors) forms.
Permissions (ACL)
On each node, grant a principal allow or deny for a set of privileges.
acl:
- group: commerce-operators
privileges: jcr:read, jcr:write
effect: allow
- user: anonymous
privileges: [jcr:all]
effect: deny
- the grantee is exactly one of
group/user/principal privilegesare JCR privileges such asjcr:read,jcr:write,jcr:alleffectisallowordeny
ACLs can be set from the Content Browser Inspector (permissions) or from provisioning nodes.
Non-interactive execution and runAs
Execution contexts that have no interactive sign-in run as anonymous (guest) by default. For example:
- Public endpoints under
/content/public(reachable unauthenticated) - Service tasks, task listeners and execution listeners run by the BPM engine (the engine thread carries no user identity)
- EIP timer-fired routes and other work not tied to a request
Anonymous cannot read protected resources whose ACL denies anonymous — such as /etc/... configuration that holds integration secrets, or server-side integration scripts. When such work touches a protected resource it fails with AccessDenied, unable to read even the configuration or script itself.
The fix is to run as a service account (runAs). How you specify it depends on the execution context:
| Execution context | How to set runAs |
|---|---|
| BPM (service task / task & execution listeners) | Set the service-account name in the CmsDelegate runAs field |
EIP (steps such as cms: scripts) |
Set the runAs header (typically via a dedicated privileged direct: route) |
| Public endpoint | Don't read secrets directly; delegate to a privileged direct: route and receive only the result (the verdict) |
Keep the public endpoint itself anonymous (least privilege) and isolate secret reads and signature verification in a service-account privileged route.
Operational tips
- Give a service account access by adding it to a normal group and granting that group on the relevant nodes.
- Change or reset passwords in Identity Manager (provisioning never changes an existing password).
- Authentication is based on SAML 2.0 (SP / IdP bundled with zero configuration).