SpringBoot2开启mongodbSSL连接与连接池配置

本文基于springboot2采用host方式配置mongodb ip连接,官方也支持uri方式连接mongodb(mongodb://ip:端口/数据库名称)。
POM.xml配置

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
</parent>
<dependencies>
<!--mongodb-->
  <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-mongodb</artifactId>
  </dependency>
</dependencies>

在application.yml中配置mongodb信息

spring:
  data:
    mongodb:
      #uri: mongodb://ip:端口/数据库名称
      host: 127.0.0.1
      username: root
      password: password
      port: 27071
      database: test //配置使用哪个数据库
      authentication-database: admin

配置详解:
1.host为mongodb的ip,在副本集的mongodb中推荐配置为primary的ip,单节点mongodb直接配置ip即可。

2.authentication-database为连接mongodb时使用哪个数据库作为登录鉴权数据库,需要注意自己创建的用户属于哪个mongodb数据库。

3.mongodb基本配置类为MongoProperties.java,可自行查看。
至此springboot就可以连接mongodb了,直接注入MongoTemplate对象就可以操作

mongodb开启SSL连接
MongoClientOptions.java中有关于SSL连接,心跳检测,连接池,是否启用短链接,链接时间管理等更多详细配置项。
如果使用自己搭建的mongdb需要使用openssl制作证书并配置可参考:MongoDB使用SSL
mongoDB官方文档
公司项目使用的是云数据库,开启SSL连接后可下载客户端证书,在需要创建新的证书信赖库时需要使用 keytool -importcert -trustcacerts -file 需要导入的证书文件路径 -keystore 证书信赖库地址 -storepass 证书信赖库密码 ,此命令将证书加入新创建的java证书库中。非交互式:在命令最后加参数-noprompt

如果需要将证书加入已存在的信赖库中使用如下命令:keytool -export -alias 别名 -keystore 信赖库位置/XX.jks -storepass 秘钥库密码 -file 需导入的证书

在程序中设置JVM 系统属性以指向正确的信任库和密钥库。
System.setProperty(“javax.net.ssl.trustStore”,“证书路径/XX.JKS”);
System.setProperty(“javax.net.ssl.trustStorePassword”,“XXX”);
SSL配置代码如下:

import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Collections;
import java.util.List;

//mongoSSl连接配置类
@Configuration
public class MongoSSL {
    @Bean
    public MongoClient createNetworkMongoClient(MongoProperties properties) {
        //properties 对象为springboot创建,可直接用
        MongoCredential credentials = getCredentials(properties);
        String host = properties.getHost() == null ? "localhost" : properties.getHost();
        int port = properties.getPort() == null ? 27017 : properties.getPort();
        List<ServerAddress> addrs = Collections.singletonList(new ServerAddress(host, port));
        System.setProperty("javax.net.ssl.trustStore","证书路径");
        System.setProperty("javax.net.ssl.trustStorePassword","密钥库密码");
        MongoClientOptions options = MongoClientOptions.builder()
                .sslEnabled(true) //开启SSL连接
                .sslInvalidHostNameAllowed(true) //不检查证书域名
                .minConnectionsPerHost(1) //连接池最小连接数,最大连接数默认为100
                .build();
        return new MongoClient(addrs, credentials, options);
    }

    private MongoCredential getCredentials(MongoProperties properties) {
        String username = properties.getUsername();
        String database = properties.getAuthenticationDatabase() == null
                ? properties.getMongoClientDatabase()
                : properties.getAuthenticationDatabase();
        //此处可将加密的密码解密,替换配置文件中的值
        properties.setPassword(new String(properties.getPassword()).toCharArray());
        char[] password = properties.getPassword();
        return MongoCredential.createCredential(username, database, password);
    }
}

如有不足之处欢迎指正,转载请注明出处!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐