Pass-thru VaultToken obtained from ReactiveSessionManager

We now pass-thru the token obtained from ReactiveSessionManager instead of caching it.
Previously, we used a method reference and the method reference cached the SessionToken Mono instead of requesting a fresh token each time from the session manager.

Closes gh-382.
This commit is contained in:
Mark Paluch
2020-01-24 15:14:48 +01:00
parent cc2b50e7ac
commit 3b43fdac40
2 changed files with 38 additions and 2 deletions

View File

@@ -55,6 +55,7 @@ import org.springframework.vault.core.ReactiveVaultOperations;
import org.springframework.vault.core.ReactiveVaultTemplate;
import org.springframework.vault.support.ClientOptions;
import org.springframework.vault.support.SslConfiguration;
import org.springframework.vault.support.VaultToken;
import org.springframework.web.reactive.function.client.WebClient;
/**
@@ -156,7 +157,13 @@ public class VaultReactiveBootstrapConfiguration {
@Bean
@ConditionalOnMissingBean
public SessionManager vaultSessionManager(ReactiveSessionManager sessionManager) {
return sessionManager.getSessionToken()::block;
return () -> {
VaultToken token = sessionManager.getSessionToken().block();
Assert.state(token != null,
"ReactiveSessionManager returned a null VaultToken");
return token;
};
}
/**

View File

@@ -16,6 +16,8 @@
package org.springframework.cloud.vault.config;
import java.util.concurrent.atomic.AtomicLong;
import org.junit.Test;
import reactor.core.publisher.Mono;
@@ -27,6 +29,7 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.vault.authentication.AuthenticationSteps;
import org.springframework.vault.authentication.AuthenticationStepsFactory;
import org.springframework.vault.authentication.LifecycleAwareSessionManager;
import org.springframework.vault.authentication.ReactiveSessionManager;
import org.springframework.vault.authentication.SessionManager;
import org.springframework.vault.authentication.SimpleSessionManager;
import org.springframework.vault.authentication.VaultTokenSupplier;
@@ -109,6 +112,20 @@ public class VaultReactiveBootstrapConfigurationTests {
});
}
@Test
public void sessionManagerBridgeShouldNotCacheTokens() {
this.contextRunner.withUserConfiguration(TokenSupplierConfiguration.class,
CustomSessionManager.class).run(context -> {
SessionManager sessionManager = context.getBean(SessionManager.class);
assertThat(sessionManager.getSessionToken().getToken())
.isEqualTo("token-1");
assertThat(sessionManager.getSessionToken().getToken())
.isEqualTo("token-2");
});
}
@Configuration
static class AuthenticationFactoryConfiguration {
@@ -124,7 +141,19 @@ public class VaultReactiveBootstrapConfigurationTests {
@Bean
VaultTokenSupplier vaultTokenSupplier() {
return () -> Mono.just(VaultToken.of("foo"));
AtomicLong counter = new AtomicLong();
return () -> Mono.just(VaultToken.of("token-" + counter.incrementAndGet()));
}
}
@Configuration
static class CustomSessionManager {
@Bean
ReactiveSessionManager reactiveVaultSessionManager(
VaultTokenSupplier tokenSupplier) {
return tokenSupplier::getVaultToken;
}
}