LabHub

Blog

Keycloak 26.7 — SCIM Promoted to Preview, Multi-Cluster v2 Without External Infinispan, and What to Watch in the Upgrade

한국어English日本語中文

Introduction — One Minor Every Quarter, and This Time It's 26.7

Keycloak has been shipping minors roughly every three months lately. By GitHub release dates, 26.5.0 landed on January 6, 2026, 26.6.0 on April 8, and 26.7.0 on July 9. Most minors are worth a quick skim of the release notes and nothing more, but this one has more for an operator to snag on — two long-awaited features (SCIM, multi-cluster without an external cache) landed in preview, and the breaking/notable list in the upgrade guide is unusually long.

This post is an operations-focused read built by cross-checking the official release notes against the repository's original adoc files (release notes, upgrade guide), plus Profile.java, which is where feature flags are actually defined. If Keycloak 26's architecture itself is new to you, read the Keycloak 26 architecture deep dive first.

The SCIM API — a Four-Year-Old Issue Reaches Core (Preview)

SCIM (System for Cross-domain Identity Management) is a protocol for reading and writing identity resources like users and groups across systems through a standard REST API (schema in RFC 7643, protocol in RFC 7644). It's taken for granted in commercial IdPs like Okta or Entra ID, but Keycloak core has never had it. The SCIM support request opened in August 2022 has racked up 300 reactions and is still open; in the meantime the gap has been filled by third-party extensions like scim-for-keycloak.

That gap has now started to close in core. Tracing the timeline through the code tells the story: the scim-api feature flag was quietly added to Profile.java as experimental in 26.6.0 (the 26.6.0 release notes don't mention it at all), and it was promoted to preview in 26.7.0. It's off by default, so you need --features=scim-api to turn it on, and even after that it has to be toggled per realm in the realm settings.

Per the SCIM chapter of the admin guide, the scope of the implementation is:

Endpoints are exposed per realm.

/realms/<realm-name>/scim/v2/ServiceProviderConfig
/realms/<realm-name>/scim/v2/ResourceTypes
/realms/<realm-name>/scim/v2/Schemas
/realms/<realm-name>/scim/v2/Users
/realms/<realm-name>/scim/v2/Groups

No new authorization model was built for this — it reuses the same realm-management roles as the Admin REST API. Writing users needs manage-users, reading needs view-users, and searching needs query-users/query-groups — if you already have a service account for the Admin API, SCIM works with no extra setup. Only confidential clients are allowed to call it; public clients are rejected.

One design choice worth noting is the protection of admin resources. SCIM clients typically run with broad management privileges, so the docs explicitly guard against a compromised provisioning client deleting admin accounts or pushing users into admin groups — SCIM lookups of users or groups that carry management roles return only a minimal representation (roughly id, schemas, userName), and writes to them are rejected with a 403. Admin accounts can still only be touched through the Admin console and the Admin REST API.

To be honest about the limits: what landed is only the direction where Keycloak becomes the SCIM server. That covers inbound provisioning — an HR system or identity governance platform pushing users into and out of Keycloak. Going the other way, Keycloak acting as a SCIM client to federate users in from an external SCIM provider is still tracked in a separate, still-open issue, and the docs only list federation from an external SCIM service provider and push-based real-time events as future-release plans. Outbound provisioning — Keycloak pushing changes to downstream apps — is also out of scope here; that remains extension territory. And preview is preview: it's unsupported, and the final shape can still change.

Multi-Cluster v2 — No More External Infinispan (Preview)

Until now, Keycloak's multi-site HA (v1) required standing up and operating a separate external Infinispan (Data Grid) cluster for cross-site session replication, on top of vendor-specific fencing infrastructure for automatic failover — the setup covered in the Keycloak HA clustering guide. If you've operated it, you know the cost of babysitting a second distributed system — the cache cluster — just to keep an auth server highly available isn't small.

26.7's multi-cluster v2 strips out that external dependency entirely. The architecture changes like this:

That description alone might sound like it covers geographic DR too, but the official guide pins down the constraints, and carrying them over verbatim:

One more thing from an operations angle — in Profile.java this feature is declared with FeatureUpdatePolicy.SHUTDOWN. That means toggling the flag on or off can't be rolled out gradually; it requires a full cluster shutdown. This isn't the kind of feature you slot into an already-running production system without downtime.

To sum up, v2 is "region-local multi-cluster availability with the external Infinispan operations removed," not "two data centers far apart." What you get in exchange is clear, though — one fewer distributed system to manage, and no more requirement to be locked into a specific environment like Kubernetes or AWS. If your load fits inside the tested envelope and your organization can run the DB with synchronous replication, it's a trade worth making against v1's operational complexity.

A side note: at tag time, the original release notes had an inconsistency — labeling this feature preview in the highlights but experimental in the body heading (it's been cleaned up to preview on the main branch), while Profile.java in code had it as PREVIEW from the start. When the release notes and the code disagree, trust the code.

Organizations — Multi-Tenancy Delegation Gets Practical

As covered in designing SSO for multi-tenant SaaS, Keycloak's Organizations feature manages multiple tenants (organizations) within a single realm. Until now, though, managing an organization required the high-privilege manage-realm role — effectively handing a tenant admin full realm management rights, which made "delegation" a bit of a stretch.

26.7 fixes that.

There's a breaking change bundled in too. The organization member list API now returns the brief representation by default. If you need the full user representation, you have to request it explicitly with a query parameter.

GET /admin/realms/{realm}/organizations/{id}/members?briefRepresentation=false

The email/firstName/lastName filters on the organization invitation list also changed from partial match to case-insensitive exact match — use the search parameter if you need partial matching. If you have automation depending on these APIs, check first whether the response shape and filter behavior changed under you.

What's Easy to Trip Over in the Upgrade

Here's what I picked out of this release's upgrade guide as things an operator is actually likely to hit. See the full upgrade guide for the complete list.

PostgreSQL asynchronous commit is now on by default. Transactions that only touch volatile tables — persisted user sessions, client sessions, login failures, events — are now handled with PostgreSQL's async commit (logout still forces synchronous commit). It's a performance-motivated change, but you need to understand exactly what it means: per the PostgreSQL docs, asynchronous commit returns success before the WAL is flushed to disk, and if the server crashes, commits in that window are lost. The loss window is at most three times wal_writer_delay (200ms by default). Nothing gets corrupted — what disappears is at most the last well-under-a-second of session/event writes, and from the user's perspective it just means logging back in. Worth calling out, though, is that the events table is included — that means a login event right before a crash could be missing from the audit log, so if you're in an environment with strict audit requirements, decide whether to opt out with --spi-connections-jpa--quarkus--async-commit=false.

X.509 client authentication gets a CA Subject DN option, and it's effectively mandatory now. If you're authenticating clients with mTLS, the admin console now enforces specifying the subject DN of the trust-anchor CA. Existing configurations keep working for now, but starting with the next major, server-side validation kicks in and creates/updates/imports without this option will be rejected. The option that let you match certificates by regex instead of an exact DN is also deprecated alongside this. If you're passing certificates through headers behind a TLS-terminating proxy, double-check that the truststore is set up to validate the client certificate chain.

The self-registration flow changes. If a realm has self-registration and Verify Email enabled together, the password field is now gone from the registration form by default. Users register with just a profile, and after their email is verified, they set a password (or OTP, or passkey). This flips the old order of creating credentials before the email is even verified — it's a change that touches the registration UX and every bit of documentation and screenshots along with it. There's a switch to restore the old behavior, but it's marked deprecated.

The rest, compressed into a list:

Deprecation Radar — What to Turn Off or Migrate Off of Now

Other Standards Experiments — One Paragraph Each

This release has an unusually large number of experimental-tagged standards implementations. All are off by default, and keep in mind experimental is a stage earlier than preview as you skim these.

The one thing promoted from preview to fully supported is step-up authentication for SAML clients — the authentication-context requirement that used to be OIDC-only is now open to SAML SPs as well.

So, When Do You Upgrade, and What Do You Turn On

Here's how I'd call it.

Closing

Looking only at the headline items (SCIM, multi-cluster v2), Keycloak 26.7 reads like a preview showcase, but the direction underneath is consistent — it absorbs gaps that third-party extensions and external infrastructure used to fill into core standard implementations (SCIM, SSF, AuthZEN), splits apart high-privilege roles (the organization management roles, removing view-system), and tightens up old looseness (X.509 CA DN, URI template validation, the SHA-1 retirement notice). For anyone self-hosting an IdP, it's a welcome direction, and the only price is a longer upgrade guide. Don't just skim the release notes — walking through the upgrade guide as a checklist once is worth the time.

References

Comments

No comments yet.

Sign in to leave a comment