我有一个与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;)。
提前致谢
答案 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
数据库。
另外,看看这个:
在设置应用程序数据库方面,这一行应该很有意思:
spring.data.mongodb.database=test # Database name.