Get ahead
VMware offers training and certification to turbo-charge your progress.
Learn moreOn behalf of the community, I would like to announce two new Spring Vault milestones: 1.1.0 M1 and 2.0.0 M2. Release 1.1.0 M1 ships with 24 tickets completed and 2.0.0 M2 with 7 resolved tickets and are available from the milestone repository.
Since the previous releases, these features have made it into the current milestones:
Vault login using via AWS IAM
Rotation of generic secrets based on their lease duration
Introduction of VaultEndpointProvider
to configure endpoints dynamically
additionally, 2.0.0 M2 ships with:
Authentication DSL to declare authentication flows
Reactive support based on Spring Framework 5 WebClient
and Project Reactor
Enhanced tooling support by adding @NonNullApi
and @Nullable
annotations to be picked up by your favorite IDE
Authentication steps provide reusability of common authentication activity. Steps created via AuthenticationSteps
describe an authentication flow in a functional style leaving the actual authentication execution to specific executors.
// Static token use
AuthenticationSteps.just(VaultToken.of(…));
// AppRole authentication
AuthenticationSteps.fromSupplier(
// Construct login body
() -> Collections.singletonMap("role_id", options.getRoleId()))
// post the payload to Vault to log in
.login("auth/{mount}/login", options.getPath());
Authentication flows require an executor to perform the actual login. We provide two executors for according to the supported execution models:
AuthenticationStepsExecutor
as a drop-in replacement for synchronous ClientAuthentication
.
AuthenticationStepsOperator
for reactive execution.
ClientAuthentication
's come with static factory methods to create AuthenticationSteps
for their authentication-specific options:
CubbyholeAuthenticationOptions options = …
RestOperations restOperations = …
AuthenticationSteps steps = CubbyholeAuthentication.createAuthenticationSteps(options);
AuthenticationStepsExecutor executor = new AuthenticationStepsExecutor(steps, restOperations);
VaultToken token = executor.login();
Authentication DSL is a pre-requisite for a reactive Vault client to decouple the authentication steps from their actual execution.
Spring Vault’s reactive client support is built on top of Authentication DSL and Spring Framework 5’s WebClient
. Reactive support covers read/write/list and delete actions via ReactiveVaultTemplate
and a caching VaultToken
supplier for session management. You can use almost all authentication mechanisms to obtain a Vault token. The following mechanisms implement AuthenticationStepsFactory
and provide AuthenticationSteps
for non-blocking login:
AppId
AppRole
AWS-EC2
Client certificates
Cubbyhole
Static tokens
Create a configuration class to get started with reactive support:
public class Foo extends AbstractReactiveVaultConfiguration {
@Override
public VaultEndpoint vaultEndpoint() {
return VaultEndpoint.from(URI.create("https://localhost:8200"));
}
@Override
public ClientAuthentication clientAuthentication() {
return new AwsEc2Authentication(restOperations());
}
}
Configuration support for AbstractReactiveVaultConfiguration
adapts authentications which implement AuthenticationStepsFactory
to a reactive authentication method and configures both, the imperative and reactive, clients. Sessions are not shared between the two clients but that’s a future task. Ypu can use ReactiveVaultTemplate
standalone:
reactiveVaultTemplate.write("secret/mykey", Collections.singletonMap("hello", "world"))
.thenMany(vaultOperations.list("secret"))
.subscribe(item -> System.out.println(item));
or within a reactive runtime infrastructure such as Spring WebFlux:
@RestController
public class SecretsController {
private final ReactiveVaultOperations operations;
// Constructor omitted for brevity
@GetMapping("secrets")
Flux<List> listSecrets() {
return vaultOperations.list("secret");
}
}
Without the community, we couldn’t be the successful project we are today. I’d like to thank everyone that created issues & provided feedback.
For a complete list of changes see the changelogs of 1.1.0 M1 and 2.0.0 M2.
Project Page | GitHub | Issues | Documentation for 1.1.0 M1 | Documentation for 2.0.0 M2 | Stack Overflow