From 1595f98eb437020423ef7c501a583cf8754b1494 Mon Sep 17 00:00:00 2001 From: Bishen Yu Date: Sat, 18 Jul 2026 09:17:19 +0800 Subject: [PATCH] Add password support to Redis chat memory autoconfigure Expose spring.ai.chat.memory.repository.redis.password and wire it into the Jedis RedisClient when configured. Keep legacy spring.ai.chat.memory.redis prefix delegation and document the new property. Fixes #6621 Signed-off-by: Bishen Yu --- ...ChatMemoryRepositoryAutoConfiguration.java | 11 ++++++++ .../RedisChatMemoryRepositoryProperties.java | 13 ++++++++++ .../RedisChatMemoryProperties.java | 10 ++++++++ ...RedisChatMemoryAutoConfigurationTests.java | 25 +++++++++++++++++++ .../modules/ROOT/pages/api/chat-memory.adoc | 1 + 5 files changed, 60 insertions(+) diff --git a/auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-redis/src/main/java/org/springframework/ai/model/chat/memory/repository/redis/autoconfigure/RedisChatMemoryRepositoryAutoConfiguration.java b/auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-redis/src/main/java/org/springframework/ai/model/chat/memory/repository/redis/autoconfigure/RedisChatMemoryRepositoryAutoConfiguration.java index 99e49445f3..2f497281c1 100644 --- a/auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-redis/src/main/java/org/springframework/ai/model/chat/memory/repository/redis/autoconfigure/RedisChatMemoryRepositoryAutoConfiguration.java +++ b/auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-redis/src/main/java/org/springframework/ai/model/chat/memory/repository/redis/autoconfigure/RedisChatMemoryRepositoryAutoConfiguration.java @@ -16,6 +16,8 @@ package org.springframework.ai.model.chat.memory.repository.redis.autoconfigure; +import redis.clients.jedis.DefaultJedisClientConfig; +import redis.clients.jedis.JedisClientConfig; import redis.clients.jedis.RedisClient; import org.springframework.ai.chat.memory.ChatMemory; @@ -71,6 +73,15 @@ public RedisChatMemoryRepositoryProperties redisChatMemoryRepositoryProperties(E @Bean @ConditionalOnMissingBean public RedisClient jedisClient(RedisChatMemoryRepositoryProperties properties) { + if (StringUtils.hasText(properties.getPassword())) { + JedisClientConfig clientConfig = DefaultJedisClientConfig.builder() + .password(properties.getPassword()) + .build(); + return RedisClient.builder() + .hostAndPort(properties.getHost(), properties.getPort()) + .clientConfig(clientConfig) + .build(); + } return RedisClient.builder().hostAndPort(properties.getHost(), properties.getPort()).build(); } diff --git a/auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-redis/src/main/java/org/springframework/ai/model/chat/memory/repository/redis/autoconfigure/RedisChatMemoryRepositoryProperties.java b/auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-redis/src/main/java/org/springframework/ai/model/chat/memory/repository/redis/autoconfigure/RedisChatMemoryRepositoryProperties.java index 1c6720245e..a4e8366140 100644 --- a/auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-redis/src/main/java/org/springframework/ai/model/chat/memory/repository/redis/autoconfigure/RedisChatMemoryRepositoryProperties.java +++ b/auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-redis/src/main/java/org/springframework/ai/model/chat/memory/repository/redis/autoconfigure/RedisChatMemoryRepositoryProperties.java @@ -46,6 +46,11 @@ public class RedisChatMemoryRepositoryProperties { */ private int port = 6379; + /** + * Redis server password. + */ + private @Nullable String password; + /** * Name of the Redis search index. */ @@ -103,6 +108,14 @@ public void setPort(int port) { this.port = port; } + public @Nullable String getPassword() { + return this.password; + } + + public void setPassword(@Nullable String password) { + this.password = password; + } + public String getIndexName() { return this.indexName; } diff --git a/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-redis/src/main/java/org/springframework/ai/model/chat/memory/redis/autoconfigure/RedisChatMemoryProperties.java b/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-redis/src/main/java/org/springframework/ai/model/chat/memory/redis/autoconfigure/RedisChatMemoryProperties.java index f13126fb03..6eae3d7c82 100644 --- a/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-redis/src/main/java/org/springframework/ai/model/chat/memory/redis/autoconfigure/RedisChatMemoryProperties.java +++ b/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-redis/src/main/java/org/springframework/ai/model/chat/memory/redis/autoconfigure/RedisChatMemoryProperties.java @@ -66,6 +66,16 @@ public void setPort(int port) { this.delegate.setPort(port); } + @DeprecatedConfigurationProperty(replacement = "spring.ai.chat.memory.repository.redis.password") + @Deprecated(since = "2.0.1", forRemoval = true) + public @Nullable String getPassword() { + return this.delegate.getPassword(); + } + + public void setPassword(@Nullable String password) { + this.delegate.setPassword(password); + } + @DeprecatedConfigurationProperty(replacement = "spring.ai.chat.memory.repository.redis.index-name") @Deprecated(since = "2.0.1", forRemoval = true) public String getIndexName() { diff --git a/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-redis/src/test/java/org/springframework/ai/model/chat/memory/redis/autoconfigure/RedisChatMemoryAutoConfigurationTests.java b/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-redis/src/test/java/org/springframework/ai/model/chat/memory/redis/autoconfigure/RedisChatMemoryAutoConfigurationTests.java index ae320aabef..562e23cb4a 100644 --- a/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-redis/src/test/java/org/springframework/ai/model/chat/memory/redis/autoconfigure/RedisChatMemoryAutoConfigurationTests.java +++ b/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-redis/src/test/java/org/springframework/ai/model/chat/memory/redis/autoconfigure/RedisChatMemoryAutoConfigurationTests.java @@ -68,4 +68,29 @@ void propertiesWithNewPrefix() { }); } + @Test + void passwordWithOldPrefix() { + this.contextRunner + .withPropertyValues("spring.ai.chat.memory.redis.host=10.0.0.1", "spring.ai.chat.memory.redis.port=6380", + "spring.ai.chat.memory.redis.password=secret", + "spring.ai.chat.memory.redis.initialize-schema=false") + .run(context -> { + var chatProperties = context.getBean(RedisChatMemoryRepositoryProperties.class); + assertThat(chatProperties.getPassword()).isEqualTo("secret"); + }); + } + + @Test + void passwordWithNewPrefix() { + this.contextRunner + .withPropertyValues("spring.ai.chat.memory.repository.redis.host=10.0.0.1", + "spring.ai.chat.memory.repository.redis.port=6380", + "spring.ai.chat.memory.repository.redis.password=secret", + "spring.ai.chat.memory.repository.redis.initialize-schema=false") + .run(context -> { + var chatProperties = context.getBean(RedisChatMemoryRepositoryProperties.class); + assertThat(chatProperties.getPassword()).isEqualTo("secret"); + }); + } + } diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat-memory.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat-memory.adoc index 828ce772bf..c921c3d8f8 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat-memory.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat-memory.adoc @@ -522,6 +522,7 @@ ChatMemory chatMemory = MessageWindowChatMemory.builder() |Property | Description | Default Value | `spring.ai.chat.memory.repository.redis.host` | Redis server host | `localhost` | `spring.ai.chat.memory.repository.redis.port` | Redis server port | `6379` +| `spring.ai.chat.memory.repository.redis.password` | Redis server password | _none_ | `spring.ai.chat.memory.repository.redis.index-name` | Name of the Redis search index | `chat-memory-idx` | `spring.ai.chat.memory.repository.redis.key-prefix` | Key prefix for chat memory entries | `chat-memory:` | `spring.ai.chat.memory.repository.redis.time-to-live` | Time to live for chat memory entries (e.g., `24h`, `30d`) | _no expiration_