Access requests and just-in-time grants
Standing privilege is how least-privilege erodes: access granted for one task quietly becomes permanent. Zynth Auth's access requests invert the default — a member asks for a role, a reviewer approves it for a bounded window, and the grant expires by itself. Extension is a new request, with a new justification, on the record.
Availability — two gates, both required. Access governance is an enterprise-plan capability (Plans and entitlements), and it must be enabled on the deployment. When either is missing,
/api/v1/authz/requestsreturns404and the console shows a quiet "not enabled" card — the surface does not advertise itself to an organization that has not bought it.
How it works
- Ask. Any member requests a role — system or custom — with a written justification
and a duration (1–90 days):
POST /api/v1/authz/requests, or Access Requests in the console. Agents and API keys are refused: agent authority is delegations, API-key authority is scopes. - Review. Anyone holding
authz:assignments:managesees the inbox and decides — the natural rule: a request is decided by someone who could have made the assignment themselves. You can never decide your own request, whatever you hold. - Grant, time-bounded. Approval creates a normal role assignment with an expiry — the same assignment every other grant path uses, visible in Access Control like any other. When the window lapses, the access is simply gone at the next permission resolve; nothing needs to run for the expiry to hold.
A pending request that nobody decides expires on its own after 14 days. Requesters can withdraw a pending ask; a duplicate ask for the same role returns the existing one instead of spamming the inbox.
What you get for compliance
Every lifecycle step — who asked for what and why, who decided, and the exact grant it produced — is written to the tamper-evident audit log and mapped to SOC 2 CC6.1–CC6.3 and ISO 27001 A.5.15/A.5.18. Two built-in detections watch the surface: a burst of requests from one principal, and rapid grants by one approver.
Separation of duties
Tenants can declare mutually-exclusive role sets (/api/v1/authz/sod-rules, with
seeded templates for the obvious pairs). A grant of any role in a set is refused while the
grantee holds another role from the same set — wherever the grant comes from: the console,
an invitation, a just-in-time approval, or your IdP's SCIM group sync. Changing someone's
role from one side of a pair to the other is allowed (the change resolves the conflict),
and a grant that already expired holds nothing.
When an access request would cross a SoD rule, a plain approval is refused with the rule's
name. The only way through is deliberate: the reviewer approves again with an explicit
sod_override, which is recorded on the request, written to the audit log, and raises a
security detection every single time — an override nobody reviews is a block that does not
exist. Enforcement fails closed: if the rules cannot be evaluated, the grant is refused.
Certification campaigns
Periodically prove that standing access is still justified. Opening a campaign
(POST /api/v1/authz/campaigns) snapshots every live role assignment in scope as a
review item; reviewers — holders of the campaign's designated reviewer permission, and
never for their own access — attest (the access stands) or revoke (the access
ends immediately) each item, with a reason on the record.
Closing the campaign settles whatever was not reviewed. By default, unreviewed grants
are auto-revoked — a review nobody performed must not silently renew access. A
campaign can opt out at creation, in which case unreviewed items are marked lapsed and
the grants deliberately stand, visibly. Every step maps to the SOC 2 CC6.3 and
ISO 27001 A.5.18 access-review controls, and a built-in detection flags rubber-stamp
cadences (dozens of decisions by one reviewer in minutes).
Requesting a single permission
Request a role that carries it. If no role fits, a tenant admin can define a one-permission custom role (Access Control → Roles) — including over your own applications' custom permissions — and members can then request exactly that. One grant machinery, no special cases.