From ea33cd40e63171eac902499096dcac83e9579ed4 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 22 Jun 2016 09:35:07 +0200 Subject: [PATCH] DATAREDIS-524 - Use password to connect Redis nodes using Sentinel. LettuceConnectionFactory and DefaultLettucePool now use the configured password to authenticate with Redis. Authentication is applied when connecting to nodes that were obtained from Redis Sentinel. Original Pull Request: #204 --- .../lettuce/DefaultLettucePool.java | 9 ++++++- .../lettuce/LettuceConnectionFactory.java | 9 ++++++- .../lettuce/DefaultLettucePoolTests.java | 21 ++++++++++++++++ .../LettuceConnectionFactoryUnitTests.java | 24 +++++++++++++++++++ 4 files changed, 61 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/DefaultLettucePool.java b/src/main/java/org/springframework/data/redis/connection/lettuce/DefaultLettucePool.java index 2ba6b3c7b..9939195b8 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/DefaultLettucePool.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/DefaultLettucePool.java @@ -26,6 +26,7 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.data.redis.connection.PoolException; import org.springframework.data.redis.connection.RedisSentinelConfiguration; import org.springframework.util.Assert; +import org.springframework.util.StringUtils; import com.lambdaworks.redis.RedisAsyncConnection; import com.lambdaworks.redis.RedisClient; @@ -120,7 +121,13 @@ public class DefaultLettucePool implements LettucePool, InitializingBean { private RedisURI getRedisURI() { if (isRedisSentinelAware()) { - return LettuceConverters.sentinelConfigurationToRedisURI(sentinelConfiguration); + RedisURI redisURI = LettuceConverters.sentinelConfigurationToRedisURI(sentinelConfiguration); + + if (StringUtils.hasText(password)) { + redisURI.setPassword(password); + } + + return redisURI; } return createSimpleHostRedisURI(); diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java index 39cfd1147..f403508b5 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java @@ -607,7 +607,14 @@ public class LettuceConnectionFactory implements InitializingBean, DisposableBea } private RedisURI getSentinelRedisURI() { - return LettuceConverters.sentinelConfigurationToRedisURI(sentinelConfiguration); + + RedisURI redisURI = LettuceConverters.sentinelConfigurationToRedisURI(sentinelConfiguration); + + if (StringUtils.hasText(password)) { + redisURI.setPassword(password); + } + + return redisURI; } /** diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/DefaultLettucePoolTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/DefaultLettucePoolTests.java index 59c7094df..4eb1d32d1 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/DefaultLettucePoolTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/DefaultLettucePoolTests.java @@ -15,8 +15,11 @@ */ package org.springframework.data.redis.connection.lettuce; +import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; +import static org.springframework.test.util.ReflectionTestUtils.*; +import java.util.Collections; import java.util.concurrent.TimeUnit; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; @@ -26,9 +29,11 @@ import org.junit.Test; import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.connection.PoolConfig; import org.springframework.data.redis.connection.PoolException; +import org.springframework.data.redis.connection.RedisSentinelConfiguration; import com.lambdaworks.redis.RedisAsyncConnection; import com.lambdaworks.redis.RedisException; +import com.lambdaworks.redis.RedisURI; /** * Unit test of {@link DefaultLettucePool} @@ -189,6 +194,22 @@ public class DefaultLettucePoolTests { pool.getResource(); } + /** + * @see DATAREDIS-524 + */ + @Test + public void testCreateSentinelWithPassword() { + + pool = new DefaultLettucePool(new RedisSentinelConfiguration("mymaster", Collections.singleton("host:1234"))); + pool.setClientResources(LettuceTestClientResources.getSharedClientResources()); + pool.setPassword("foo"); + pool.afterPropertiesSet(); + + RedisURI redisURI = (RedisURI) getField(pool.getClient(), "redisURI"); + + assertThat(redisURI.getPassword(), is(equalTo(pool.getPassword().toCharArray()))); + } + /** * @see DATAREDIS-462 */ diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java index 8740bc1b7..f6856c740 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java @@ -21,6 +21,7 @@ import static org.hamcrest.core.IsInstanceOf.*; import static org.junit.Assert.*; import static org.springframework.test.util.ReflectionTestUtils.*; +import java.util.Collections; import java.util.concurrent.TimeUnit; import org.junit.After; @@ -28,6 +29,7 @@ import org.junit.Before; import org.junit.Test; import org.springframework.data.redis.ConnectionFactoryTracker; import org.springframework.data.redis.connection.RedisClusterConfiguration; +import org.springframework.data.redis.connection.RedisSentinelConfiguration; import com.lambdaworks.redis.AbstractRedisClient; import com.lambdaworks.redis.RedisClient; @@ -114,6 +116,28 @@ public class LettuceConnectionFactoryUnitTests { } } + /** + * @see DATAREDIS-524 + */ + @Test + @SuppressWarnings("unchecked") + public void passwordShouldBeSetCorrectlyOnSentinelClient() { + + LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory( + new RedisSentinelConfiguration("mymaster", Collections.singleton("host:1234"))); + connectionFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); + connectionFactory.setPassword("o_O"); + connectionFactory.afterPropertiesSet(); + ConnectionFactoryTracker.add(connectionFactory); + + AbstractRedisClient client = (AbstractRedisClient) getField(connectionFactory, "client"); + assertThat(client, instanceOf(RedisClient.class)); + + RedisURI redisURI = (RedisURI) getField(client, "redisURI"); + + assertThat(redisURI.getPassword(), is(equalTo(connectionFactory.getPassword().toCharArray()))); + } + /** * @see DATAREDIS-462 */