00.70.00
Release date: 2026-05-31 Previous release: 00.60.00 Maven coordinates (parent):
com.svenruppert:security-for-flow-parent:00.70.00
Closes the Konzept-V00.70 milestone — all eight phases ship:
multi-tenant foundation (TenantId / ResourceRef), 11 persistence-store
SPIs with an Eclipse-Store reference layer, store-backed services on top
of those SPIs, SecurityVersion drift-detection end-to-end across Vaadin /
REST / standalone, the Policy + Method-Security annotation processor,
hierarchy-aware permissions, account-lifecycle services (password reset,
email verification, API keys, rotating refresh tokens, sliding-window rate
limit), and a Phase-8 UI layer with secured Vaadin components plus an
OpenAPI security-metadata exporter.
No breaking API change for code that already used the 00.60 contracts.
New SPIs are opt-in and marked @ExperimentalSecurityApi while the V00.70
surface settles.
Highlights
- 13 reactor modules —
security-persistence-testkitandsecurity-persistence-eclipsestorejoin the library. - Multi-tenancy foundation —
TenantId(value)withDEFAULT, tenant-awareResourceRefandResourceAccessContext; every Phase-2 store key and Phase-4/7 service is tenant-scoped. - 11 persistence-store SPIs —
AuditEventStore,SessionStore,LoginAttemptStore,RoleAssignmentStore,BootstrapStateStore,RememberMeTokenStore,PasswordResetTokenStore,EmailVerificationTokenStore,ApiKeyStore,RefreshTokenStore,RateLimitStore— every record hash-only or single-use as appropriate, every key tenant-scoped. See Persistence. - Contract testkit + Eclipse-Store reference —
security-persistence-testkitships@Test defaultcontracts that any store adapter implements;security-persistence-eclipsestoreis validated by the same 95+ contract suite as the in-memory defaults. - SecurityVersion drift detection end-to-end — role refresh for active
sessions: sealed
SecurityVersionStatus(Current | Drifted),SecurityVersionEnforcer, theSessionStaleaudit event, a Vaadin enforcer listener (reroutes drifted sessions to login) and a REST filter (401 + WWW-Authenticate: SessionStale, RFC 7235). - Six store-backed services — drop-in replacements for the in-memory defaults once a real store is wired.
- Method-Security annotation processor —
@Securedconcrete classes get a generated<Type>Securedsubclass at compile time; the runtimeSecuredProxy.wrap(...)path is the dynamic-proxy companion. Both route through oneSecurityEnforcer. See Method Security. - Policy API —
@RequiresPolicy,PolicyRegistry, sealedPolicyDecision(Allowed | Denied | StepUpRequired). See Policy API. - Account-lifecycle stack —
PasswordResetService+EmailVerificationServicewith aSecurityNotificationSenderSPI (LoggingNotificationSenderdefault). - API keys + rotating refresh tokens —
ApiKeyAuthenticationService,TokenServicewith replay-defense viamarkReplaced(...)chain links. - Sliding-window
RateLimitPolicy— pluggable per-scope rate limit, separate fromLoginAttemptPolicy. - Hierarchy-aware permissions —
RoleHierarchySPI; two new annotations@RequiresAnyPermission,@RequiresAllPermissions. - Phase-8 secured Vaadin components —
SecuredButton(default DISABLE),SecuredRouterLink(default HIDE),SecuredMenuItem, plusSessionManagementViewand anOpenApiSecurityMetadataGenerator. - 27 sealed
AuditEventvariants — 11 new on top of the 16 from 00.60.
Module structure (10 → 13)
| Module | Status | Purpose |
|---|---|---|
security-core | — | Every SPI contract, all 11 persistence-store interfaces, the SecurityVersion stack, account-lifecycle / token / rate-limit services |
security-vaadin | — | Phase-4c enforcement listener, Phase-8 secured components + SessionManagementView |
security-rest | — | Phase-4c RestSecurityVersionFilter, Phase-8d OpenApiSecurityMetadataGenerator |
security-standalone | — | Plain-Java / desktop / CLI adapter |
security-test | — | Reusable test fixtures + JUnit-5 SecurityTestExtension |
security-processor | — | Compile-time annotation processor for @Secured |
security-persistence-testkit | NEW | Contract test suites for every persistence-store SPI |
security-persistence-eclipsestore | NEW | Eclipse-Store reference impl (org.eclipse.store:storage-embedded:4.1.0) |
demo-rest-shared / demo-vaadin / demo-rest / demo-vaadin-rest-client / demo-standalone | — | Reference demos |
New decision hierarchies (sealed)
| Type | Variants |
|---|---|
PolicyDecision | Allowed, Denied, StepUpRequired |
SecurityVersionStatus | Current(at), Drifted(snapshot, current) |
EnforcementOutcome | Continue, SessionStale(status) |
RateLimitDecision | Allowed, Throttled(eventsInWindow, limit, window, retryAfter) |
Mutation coverage
The parent POM’s pitest-test-classes typo
(junit.com.svenruppert.* → com.svenruppert.*) was fixed — these are
the first accurate measurements since the property regressed.
| Module | 00.60.00 | 00.70.00 | Tests |
|---|---|---|---|
security-core | 79 % | 86 % (1191/1381) | 956 |
security-vaadin | 90 % | 79 % ¹ (242/305) | 172 |
security-rest | 95 % | 95 % (86/91) | 71 |
security-standalone | 98 % | 97 % (33/34) | 30 |
security-processor | — | 82 % (23/28) ² | 11 |
security-persistence-eclipsestore | — | 70 % (231/328) | 104 |
¹ The security-vaadin dip reflects the Phase-4c enforcer listener and
the Phase-8 components landing — the gap is dominated by VoidMethodCallMutator
survivors on component-construction setters with no testable side effect.
Absolute kill count rose from ~91 (00.60) to 242 (00.70).
² security-processor is 82 % with 100 % line coverage; the five
survivors are BooleanFalseReturnValsMutator flips on internal guard
returns.
Reactor totals: 1655+ tests across 14 modules, all green under
./mvnw verify.
Migration from 00.60.00
Source-compatible. Code using the 00.60 contracts compiles unchanged. The deltas worth knowing:
- POMs — version property is now
00.70.00. - Sealed
AuditEventswitches — an exhaustiveswitchoverAuditEventneeds cases for the 11 new variants (SessionStale,PasswordResetRequested,PasswordResetCompleted,EmailVerificationRequested,EmailVerified,ApiKeyUsed,ApiKeyDenied,TokenRotated,RateLimitExceeded,PolicyEvaluated,StepUpChallenged). The compiler enforces this, so it’s hard to miss. - PIT property typo fix —
pitest-test-classescorrected tocom.svenruppert.*. - Optional
security-persistence-eclipsestore— wire it as a runtime dependency to swap everyInMemory*Storedefault for the durable Eclipse-Store impl. Registration viaMETA-INF/services/; no code change in the consuming application.
Build
- Java 26 (sealed types, records, pattern matching)
- Vaadin 25.1.1 (vaadin-core, no Hilla)
- Jetty 12.1.8 EE11 for the Vaadin demos
- Maven 4 (pinned via
./mvnw; minimum4.0.0-rc-5) - Eclipse Store 4.1.0 — optional, only for
security-persistence-eclipsestore - proxybuilder 00.11.00 — for the compile-time annotation processor
./mvnw verifybuilds all 14 modules + demos; library javadocs build clean.