连接到多个mongo db主机,并在spring boot中使用其他数据库进行身份验证

时间:2017-10-25 13:58:13

标签: java database spring mongodb spring-boot

我有一个与mongo db集成的java应用程序。我碰巧有3个mongo db主机(都有相同的端口),并且必须使用除我的应用程序使用的db之外的单独数据库进行身份验证。例如:" admin"是身份验证数据库名称和" contenttest"是我的应用程序想要连接到的db。我也有凭据(用户名和密码)。我尝试使用以下uri进行连接,但它在spring boot应用程序中无效。

application.properties

toggle-sorting

我收到错误消息说使用以下错误日志进行身份验证失败。

spring.data.mongodb.authentication-database=admin
spring.data.mongodb.uri = mongodb://content_rw:<secret password>@a.mongo.db:27017,b.mongo.db:27017,c.mongo.db:27017/contenttest?wtimeoutMS=300&connectTimeoutMS=500&socketTimeoutMS=200

stacktrace也包含其他主机的类似例外。

在使用3个mongo主机时,我需要一些帮助来使用单独的数据库(&#34; admin&#34;)来实现身份验证,并使用不同的数据库(&#34; contenttest&#34;)。

提前致谢

1 个答案:

答案 0 :(得分:6)

根据documentation连接字符串URI格式为:

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

/database部分描述为:

  

可选。要连接的数据库的名称,以进行身份​​验证   字符串包括身份验证凭据   用户名密码@。如果未指定/ database和连接   字符串包含凭据,驱动程序将向管理员进行身份验证   数据库中。

您已经设置了这样的URI:

spring.data.mongodb.uri = mongodb://content_rw:<secret password>@a.mongo.db:27017,b.mongo.db:27017,c.mongo.db:27017/contenttest?wtimeoutMS=300&connectTimeoutMS=500&socketTimeoutMS=200

在您的日志中,我们可以看到以下行:

Exception authenticating MongoCredential{mechanism=null, userName='content_rw', source='contenttest', password=<hidden>, mechanismProperties={}}

MongoCredential.java中,source被描述为:

  

用户名的来源,通常是数据库的名称   用户已定义

所以看起来您已将身份验证数据库设置为/contenttest而不是:

spring.data.mongodb.authentication-database=admin

我认为您应该从URI和spring.data.mongodb.authentication-database属性中删除数据库名称,因为默认使用admin数据库。

另外,看看这个:

enter image description here

在设置应用程序数据库方面,这一行应该很有意思:

spring.data.mongodb.database=test # Database name.