From a8dc339328852e71350d4ebf1cf07e6f74efbc4d Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 22 Jun 2016 09:37:59 +0200 Subject: [PATCH 1/2] DATAREDIS-524 - NOAUTH Authentication required when connecting to Redis Sentinel with LettuceConnectionFactory. Prepare issue branch. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e6d868411f..b1e5b7e696 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-redis - 1.8.0.BUILD-SNAPSHOT + 1.8.0.DATAREDIS-524-SNAPSHOT Spring Data Redis From 9fe7b35a0c1a5823b21e898ad8ebddeee96a341f Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 22 Jun 2016 09:35:07 +0200 Subject: [PATCH 2/2] 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. --- .../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 2ba6b3c7ba..9939195b8f 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.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 void afterPropertiesSet() { 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 39cfd11476..f403508b5a 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 @@ private AbstractRedisClient createRedisClient() { } 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 59c7094dff..4eb1d32d13 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.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 void testCreateInvalidPassword() { 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 8740bc1b79..f6856c7401 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.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.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 void passwordShouldBeSetCorrectlyOnClusterClient() { } } + /** + * @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 */