From 5acd115cb3b9186cbc3d961de0cceb8276c49c2e Mon Sep 17 00:00:00 2001 From: Madhura Bhave Date: Wed, 13 May 2020 16:52:09 -0700 Subject: [PATCH] Add redis sentinel password property Closes gh-21353 --- .../redis/RedisConnectionConfiguration.java | 5 ++++- .../data/redis/RedisProperties.java | 13 ++++++++++++ .../redis/RedisAutoConfigurationTests.java | 20 ++++++++++++++++++- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisConnectionConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisConnectionConfiguration.java index ec184be695..20f4c9ea8f 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisConnectionConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisConnectionConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -82,6 +82,9 @@ abstract class RedisConnectionConfiguration { if (this.properties.getPassword() != null) { config.setPassword(RedisPassword.of(this.properties.getPassword())); } + if (sentinelProperties.getPassword() != null) { + config.setSentinelPassword(RedisPassword.of(sentinelProperties.getPassword())); + } config.setDatabase(this.properties.getDatabase()); return config; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisProperties.java index 9786af2288..803f60065d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisProperties.java @@ -301,6 +301,11 @@ public class RedisProperties { */ private List nodes; + /** + * Password for authenticating with sentinel(s). + */ + private String password; + public String getMaster() { return this.master; } @@ -317,6 +322,14 @@ public class RedisProperties { this.nodes = nodes; } + public String getPassword() { + return this.password; + } + + public void setPassword(String password) { + this.password = password; + } + } /** diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java index db3526620f..b808025520 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java @@ -37,6 +37,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.RedisNode; +import org.springframework.data.redis.connection.RedisSentinelConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration.LettuceClientConfigurationBuilder; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; @@ -199,17 +200,34 @@ class RedisAutoConfigurationTests { } @Test - void testRedisConfigurationWithSentinelAndPassword() { + void testRedisConfigurationWithSentinelAndDataNodePassword() { this.contextRunner.withPropertyValues("spring.redis.password=password", "spring.redis.sentinel.master:mymaster", "spring.redis.sentinel.nodes:127.0.0.1:26379, 127.0.0.1:26380").run((context) -> { LettuceConnectionFactory connectionFactory = context.getBean(LettuceConnectionFactory.class); assertThat(connectionFactory.getPassword()).isEqualTo("password"); + RedisSentinelConfiguration sentinelConfiguration = connectionFactory.getSentinelConfiguration(); + assertThat(sentinelConfiguration.getSentinelPassword().isPresent()).isFalse(); Set sentinels = connectionFactory.getSentinelConfiguration().getSentinels(); assertThat(sentinels.stream().map(Object::toString).collect(Collectors.toSet())) .contains("127.0.0.1:26379", "127.0.0.1:26380"); }); } + @Test + void testRedisConfigurationWithSentinelPasswordAndDataNodePassword() { + this.contextRunner.withPropertyValues("spring.redis.password=password", "spring.redis.sentinel.password=secret", + "spring.redis.sentinel.master:mymaster", + "spring.redis.sentinel.nodes:127.0.0.1:26379, 127.0.0.1:26380").run((context) -> { + LettuceConnectionFactory connectionFactory = context.getBean(LettuceConnectionFactory.class); + assertThat(connectionFactory.getPassword()).isEqualTo("password"); + RedisSentinelConfiguration sentinelConfiguration = connectionFactory.getSentinelConfiguration(); + assertThat(new String(sentinelConfiguration.getSentinelPassword().get())).isEqualTo("secret"); + Set sentinels = sentinelConfiguration.getSentinels(); + assertThat(sentinels.stream().map(Object::toString).collect(Collectors.toSet())) + .contains("127.0.0.1:26379", "127.0.0.1:26380"); + }); + } + @Test void testRedisConfigurationWithCluster() { List clusterNodes = Arrays.asList("127.0.0.1:27379", "127.0.0.1:27380");