- Tenant identifier hardening: a resolved tenant id is now validated against a configurable maximum length (
quarkus.multi-tenant.http.tenant-id.max-length, default64) and a character-set pattern (quarkus.multi-tenant.http.tenant-id.pattern, default[A-Za-z0-9_-]+) before it is published to theTenantContext. A violating identifier is rejected with HTTP 401 and never reaches downstream consumers (logs, SQL parameters, ORM tenant lookups). Rejected identifiers are sanitised — control characters stripped and length-capped — before being logged, closing a log-injection vector. (#16)
- Behaviour change: tenant-id validation is enabled by default. An application whose tenant identifiers contain characters outside
[A-Za-z0-9_-]or exceed 64 characters will now receive HTTP 401 where0.1.0accepted the request. Widenquarkus.multi-tenant.http.tenant-id.pattern/quarkus.multi-tenant.http.tenant-id.max-length, or setquarkus.multi-tenant.http.tenant-id.validation-enabled=false, to restore the previous behaviour.
Initial Quarkiverse preview release.
- Core tenant resolution API and CDI context.
- Request-scoped
TenantContextfor resolved tenant propagation. - HTTP tenant resolution strategies:
- header
- JWT claim (verified bearer)
- cookie
- path
- ORM integration module bridging
TenantContextinto Hibernate ORM multitenancy use cases. @ConfigMapping-based configuration onHttpTenantConfigwith discoverable, documented keys.- Quarkus extension descriptors (
quarkus-extension.yaml, build-time processors, codestart metadata). - Quarkiverse CI/CD canonical workflow set (
build,pre-release,release,perform-release). - Daily CI against the Quarkus snapshot via
quarkus-ecosystem-ci. - Initial Asciidoc documentation module published at
docs.quarkiverse.io/quarkus-multitenancy. - ORM module:
quarkus.multi-tenant.orm.header-filter.enabledflag to opt out of theX-Tenantheader filter (OrmTenantHeaderFilter), for applications that drive tenant resolution fromquarkus-multitenancy-httpinstead of the ORM-side filter. - Startup warning when the
jwtstrategy is active only through the implicit default chain (quarkus.multi-tenant.http.strategyunset), signalling the upcoming default-chain change (#15). The warning is informational and does not change behaviour.
TenantResolver.resolvenow returns a sealedTenantResolution(Resolved/NotApplicable/Rejected) instead ofOptional<String>. A present-but-invalid input rejects the request with HTTP 401 rather than silently falling back to the default tenant.- The JWT tenant strategy now requires SmallRye JWT (or Quarkus OIDC) for token verification. The previous base64-decode path that read claims from unsigned tokens has been removed; the resolver injects the verified
JsonWebTokenand rejects requests whose token cannot be verified or is missing the configured claim. - README rewritten for the post-migration Quarkiverse coordinates and the verified JWT behaviour.
- Quarkiverse parent POM bumped to version 22.
- The extension is marked as preview while the API stabilises. Source and binary compatibility may change before
1.0. - The default strategy chain is
header,jwt,cookie. Applications that include thejwtstrategy (explicitly or via the implicit default) must configure one of the following before the application boots:- SmallRye JWT verification via
mp.jwt.verify.publickey.*andmp.jwt.verify.issuer. - Quarkus OIDC via
quarkus.oidc.auth-server-url(or a named-tenant equivalent such asquarkus.oidc.<tenant>.auth-server-url).
- SmallRye JWT verification via
- Applications that produce a custom
JsonWebTokenoutside of SmallRye JWT / OIDC can opt out of the boot-time verification check withquarkus.multi-tenant.http.jwt.skip-startup-check=true. - The
quarkus-multitenancy-ormmodule registers anX-Tenantheader filter by default that rejects requests without the header (HTTP 400). When tenant resolution is driven byquarkus-multitenancy-http(path, jwt, or cookie), disable the ORM-side filter withquarkus.multi-tenant.orm.header-filter.enabled=falseto avoid the two filters colliding on the request lifecycle. The resolved tenant still reaches Hibernate ORM through the sharedTenantContext. - Tenants resolved from any strategy are propagated through the same
TenantContext. The extension does not enforce length, charset, or log-injection guards on the resolved identifier; downstream consumers should treat the value as untrusted input until a future hardening release lands.