Add support for Lettuce's 6.2 RedisCredentialsProvider.

We now support construction of RedisCredentialsProvider through LettuceClientConfiguration and RedisCredentialsProviderFactory.

The default implementation adapts credentials configured in RedisConfiguration objects.

Closes: #2376
Original Pull Request: #2387
This commit is contained in:
Mark Paluch
2022-08-24 10:34:52 +02:00
committed by Christoph Strobl
parent c3ee0d8b3c
commit 8f37abe950
7 changed files with 267 additions and 3 deletions

View File

@@ -37,6 +37,7 @@ import io.lettuce.core.codec.RedisCodec;
import io.lettuce.core.resource.ClientResources;
import lombok.AllArgsConstructor;
import lombok.Data;
import reactor.test.StepVerifier;
import java.time.Duration;
import java.util.Collections;
@@ -187,6 +188,59 @@ class LettuceConnectionFactoryUnitTests {
}
}
@Test // GH-2376
@SuppressWarnings("unchecked")
void credentialsProviderShouldBeSetCorrectlyOnClusterClient() {
clusterConfig.setUsername("foo");
clusterConfig.setPassword("bar");
LettuceClientConfiguration clientConfiguration = LettuceClientConfiguration.builder()
.clientResources(getSharedClientResources())
.redisCredentialsProviderFactory(new RedisCredentialsProviderFactory() {}).build();
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(clusterConfig, clientConfiguration);
connectionFactory.afterPropertiesSet();
ConnectionFactoryTracker.add(connectionFactory);
AbstractRedisClient client = (AbstractRedisClient) getField(connectionFactory, "client");
assertThat(client).isInstanceOf(RedisClusterClient.class);
Iterable<RedisURI> initialUris = (Iterable<RedisURI>) getField(client, "initialUris");
for (RedisURI uri : initialUris) {
uri.getCredentialsProvider().resolveCredentials().as(StepVerifier::create).consumeNextWith(actual -> {
assertThat(actual.getUsername()).isEqualTo("foo");
assertThat(new String(actual.getPassword())).isEqualTo("bar");
}).verifyComplete();
}
}
@Test // GH-2376
void credentialsProviderShouldBeSetCorrectlyOnStandaloneClient() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("localhost");
config.setUsername("foo");
config.setPassword("bar");
LettuceClientConfiguration clientConfiguration = LettuceClientConfiguration.builder()
.clientResources(getSharedClientResources())
.redisCredentialsProviderFactory(new RedisCredentialsProviderFactory() {}).build();
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(config, clientConfiguration);
connectionFactory.afterPropertiesSet();
ConnectionFactoryTracker.add(connectionFactory);
AbstractRedisClient client = (AbstractRedisClient) getField(connectionFactory, "client");
assertThat(client).isInstanceOf(RedisClient.class);
RedisURI uri = (RedisURI) getField(client, "redisURI");
uri.getCredentialsProvider().resolveCredentials().as(StepVerifier::create).consumeNextWith(actual -> {
assertThat(actual.getUsername()).isEqualTo("foo");
assertThat(new String(actual.getPassword())).isEqualTo("bar");
}).verifyComplete();
}
@Test // DATAREDIS-524, DATAREDIS-1045, DATAREDIS-1060
void passwordShouldNotBeSetOnSentinelClient() {
@@ -233,6 +287,41 @@ class LettuceConnectionFactoryUnitTests {
}
}
@Test // GH-2376
void sentinelCredentialsProviderShouldBeSetOnSentinelClient() {
RedisSentinelConfiguration config = new RedisSentinelConfiguration("mymaster", Collections.singleton("host:1234"));
config.setUsername("data-user");
config.setPassword("data-pwd");
config.setSentinelPassword("sentinel-pwd");
LettuceClientConfiguration clientConfiguration = LettuceClientConfiguration.builder()
.clientResources(getSharedClientResources())
.redisCredentialsProviderFactory(new RedisCredentialsProviderFactory() {}).build();
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(config, clientConfiguration);
connectionFactory.afterPropertiesSet();
ConnectionFactoryTracker.add(connectionFactory);
AbstractRedisClient client = (AbstractRedisClient) getField(connectionFactory, "client");
assertThat(client).isInstanceOf(RedisClient.class);
RedisURI redisUri = (RedisURI) getField(client, "redisURI");
redisUri.getCredentialsProvider().resolveCredentials().as(StepVerifier::create).consumeNextWith(actual -> {
assertThat(actual.getUsername()).isEqualTo("data-user");
assertThat(new String(actual.getPassword())).isEqualTo("data-pwd");
}).verifyComplete();
for (RedisURI sentinelUri : redisUri.getSentinels()) {
sentinelUri.getCredentialsProvider().resolveCredentials().as(StepVerifier::create).consumeNextWith(actual -> {
assertThat(actual.getUsername()).isNull();
assertThat(new String(actual.getPassword())).isEqualTo("sentinel-pwd");
}).verifyComplete();
}
}
@Test // DATAREDIS-1060
void sentinelPasswordShouldNotLeakIntoDataNodeClient() {