Skip to content

Commit 14f73ed

Browse files
committed
docs(permissions): the "How enforcement works" callout names every transport seam that consults the ADR-0069 gate
The callout said only the REST server and the runtime dispatcher block a gated session. Every transport seam that resolves a caller from the session now consults the gate through core's shared decision: REST, the dispatcher (MCP's HTTP endpoint included), and the route families mounted directly on the host server. Described at function level, with no route list. Claude-Session: https://claude.ai/code/session_012zwsLMxQBwHUYJgPyrpEvx Co-authored-by: Claude <noreply@anthropic.com>
1 parent 4d4040c commit 14f73ed

1 file changed

Lines changed: 14 additions & 6 deletions

File tree

‎content/docs/permissions/authentication.mdx‎

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -593,12 +593,20 @@ often before the account-level lock engages.
593593
|---|---|
594594
| `allowed_ip_ranges` | Restrict authenticated access to one or more IPv4 CIDR ranges. IP is extracted with trust-proxy awareness (`x-forwarded-for` / `cf-connecting-ip` / `x-real-ip`); requests whose IP can't be determined fail open. |
595595

596-
> **How enforcement works.** Password expiry and enforced MFA share a single
597-
> *session-validation gate*: `customSession` stamps the session with an
598-
> `authGate` posture, and the REST server + runtime dispatcher block gated
599-
> sessions from data access (auth, health, and a small allowlist still pass so
600-
> the user can remediate). This is why a non-compliant user can sign in but
601-
> can't read data until they fix the issue.
596+
> **How enforcement works.** Password expiry (an administrator-forced password
597+
> change included) and enforced MFA share a single *session-validation gate*.
598+
> `customSession` stamps the session user with an `authGate` posture, and every
599+
> transport seam that resolves a caller from the session consults it through
600+
> the one shared decision in `@objectstack/core` (`evaluateAuthGate` and its
601+
> helpers): the REST server, the runtime dispatcher (which also serves the MCP
602+
> HTTP endpoint), and every route family that a plugin or service mounts
603+
> directly on the host server and that resolves its own caller, at the family's
604+
> own door. A gated session gets `403` with the gate's own code
605+
> (`PASSWORD_EXPIRED` or `MFA_REQUIRED`) at whichever of them serves the
606+
> request. The auth endpoints and a short allow-list kept with that decision
607+
> (health and discovery among them) still pass, so the user can remediate. This
608+
> is why a non-compliant user can sign in but can't read or change data until
609+
> they fix the issue.
602610
603611
---
604612

0 commit comments

Comments
 (0)