[spring-projects/spring-boot]为 Cassandra 自动配置添加 SSL 捆绑支持

2024-06-26 583 views
4

我正在尝试使用 spring-boot-data-cassandra:3.1.3 和 spring-boot-autoconfigure:2.4.2 从我的 Spring boot 应用程序连接到 Cassandra。

我的 Cassandra 集群在 Cassandra 端启用了 SSL。因此,当我自动配置启用 SSL 的 Cassandra 连接(通过设置spring.data.cassandra.ssl=true)时,系统会为我创建默认 SSL 上下文,但我需要提供我的信任库路径和信任库密码来初始化SSLContext。没有提供data-cassandra像为 kafka( spring.kafka.ssl.truststore-location= # Location of the trust store file. spring.kafka.ssl.truststore-password= # Store password for the trust store file.) 提供的属性,因此是否有任何方法可以为我的 Cassandra 配置提供信任库文件位置和密码,AutoConfigure或者覆盖SSLContext为指定版本创建的默认设置。

回答

2

您可以使用 来CqlSessionBuilderCustomizer配置以满足您的需求。我认为添加一些属性来配置信任存储和密码是有意义的。这可以作为 #17589 的一部分来完成CqlSessionBuilderSSLContext也可以在这里特别关注 Cassandra。让我们看看团队的其他成员怎么想。

3

感谢@wilkinsona的回复。但我强烈认为应该提供此类配置的属性,以便有一个统一的解决方案,就像我们为kafka所做的那样。让我们等待团队分享他们的观点。

4
17589 可能意味着我们将全面统一 SSL 属性,以提供更具凝聚力的支持。看起来这可能是 Spring Boot 3.0 的工作。我们可能不想现在添加属性,因为我们知道它们可能会在即将发布的版本中消失。鉴于有一个可用的定制器,我认为我们应该等到我们决定如何处理 #17589 时再添加。
0

@mbhave @wilkinsona 我尝试使用 CqlSessionBuilderCustomizer 更新 SSLContext,方法是创建一个@Bean如下所示的。但这个不起作用。

@Bean
public CqlSessionBuilderCustomizer cqlSessionBuilderCustomizer() {
    return cqlSessionBuilder -> cqlSessionBuilder
            .withSslContext(getCustomSslContext());
}

它仍然只采用默认的 SSLContext。知道这是为什么吗?

7

我无法解释为什么会发生这种情况。beanCqlSessionBuilderCustomizer应该在自动配置已配置 SSL 之后应用,从而允许它们覆盖自动配置所做的任何操作。如果您提供一个小示例来说明您正在尝试做什么,我们可以仔细查看。

7

我也遇到了类似的问题,并卡在这里。在调试时,我没有看到 bean 被初始化,也没有调用 getCustomSSLContext()

0

我看到 CqlSessionBuilderCustomizer.customize 仅由 CassandraAutoConfiguration 调用。我们需要从我的配置中扩展该类吗?我们的项目使用 Reactor 框架,我已使用 AbstractReactiveCassandraConfiguration 扩展了我的配置文件。

6

如果您从 进行扩展AbstractReactiveCassandraConfiguration,这将有效地创建 ,CqlSession并且 Spring Boot 自动配置将退出,因此不会应用定制器。您可以自行在调试模式下运行 Spring Boot(添加 )并查看自动配置报告来弄清楚这debug=true一点application.properties

此层次结构具有SessionBuilderConfigurer相同的目的。您可以getSessionBuilderConfigurer在子类中重写并将代码移至那里。

寻呼 @mp911de 以获得额外的可见性。考虑到使用 Spring Boot 时有两种配置 Cassandra 的方法,我想知道我们可以做些什么来使这一点更加明显。

9

配置数据集成的多种方法适用于 JDBC、MongoDB、R2DBC、Cassandra、Couchbase、Neo4j 和 Elasticsearch。让我们在独立的票证上讨论这个问题,以免淡化对这个问题的讨论。

8

我不确定它是否特定于 Spring Data。例如,这同样适用于 WebMvc,您可以在其中子类化WebMvcConfigurationSupport或使用@EnableWebMvc并关闭 Boot 的自动配置。我们也看到有人无意中这样做。也许我们需要再次考虑https://github.com/spring-projects/spring-boot/issues/6647AbstractReactiveCassandraConfiguration ,但范围要更广?或者也许我们需要一些更好的文档来警告不要像我们已经对@EnableWebMvc和所做的那样使用@EnableWebFlux

4

太棒了。。感谢 @snicoll 的见解。。我也曾为同样的问题而苦恼,现在我知道发生了什么。。是的,你是对的。。我看到 SessionBuilder 是唯一可以覆盖的选项。你能告诉我如何实现吗?。。我确实有一个覆盖 getter 的选项,但我无法正确创建 SessionBuilderConfigurer。

8

@mkumar87 如果您想继续使用AbstractReactiveCassandraConfiguration,您可以使用以下命令配置 SSL 上下文:

@Configuration(proxyBeanMethods = false)
class CustomReactiveCassandraConfiguration extends AbstractReactiveCassandraConfiguration {

   @Override
   protected String getKeyspaceName() {
      return "example";
   }

   @Override
   protected SessionBuilderConfigurer getSessionBuilderConfigurer() {
      return (cqlSessionBuilder) -> {
         SSLContext sslContext = createSslContext();
         return cqlSessionBuilder.withSslContext(sslContext);
      };
   }

}

然后,您将实施一种createSslContext()方法来创建SSLContext满足您需求的方法。

4

完美。我刚刚让它工作了 :-) .. 我现在正在测试它!?.. 谢谢你的帮助!

7

Cassandra 的 SSL 信任存储道具或统一 SSL 配置是否在 spring-boot 3.0.0-M3 中完成?

9

@ajith428 这个问题仍然悬而未决,所以恐怕不行。