其中一个应用程序使用MongoClient作为核心,与最近启用了身份验证的MongoDB进行交互。在这个mongoClient中初始化为:
mongoClient = new MongoClient(serverAddress, Arrays.asList(MongoCredential.createCredential(userName, dbName, password.toCharArray())));
然而,在许多地方,app使用mongoTemplate来查询数据。现在,如果将MongoTemplate创建为:
new MongoTemplate(mongoClient, dbName);
导致身份验证失败。
似乎将用户凭据传递给MongoTemplate的唯一方法是使用UserCredentials类
但是,如果我们将UserCredentials传递为:
public MongoTemplate(Mongo mongo, String databaseName, UserCredentials userCredentials) {
结果是:
Usage of 'UserCredentials' with 'MongoClient' is no longer supported. Please use 'MongoCredential' for 'MongoClient' or just 'Mongo'.
似乎两个不同的API并行存在。什么是最好的方式,以便他们两个可以共同生活。
此应用使用mongodata版本为' 1.10.6.RELEASE'
答案 0 :(得分:0)
试试这个:
MongoCredential mongoCredential = MongoCredential.createCredential("user", "database","password".toCharArray());
ServerAddress address = new ServerAddress("mymongo.mycompany.com", 62797);
MongoClient mongoClient = new MongoClient(address, Arrays.asList(mongoCredential));
MongoTemplate mongoTemplate = new MongoTemplate(mongoClient, "database");
答案 1 :(得分:0)
尝试此配置:
@Configuration
public class MongoConfiguration {
@Bean
public MongoDbFactory mongoDbFactory() throws Exception {
UserCredentials userCredentials = new UserCredentials("YOUR_USER_NAME", "YOUR_PASSWORD");
return new SimpleMongoDbFactory(new Mongo(), "YOUR_DATABASE", userCredentials);
}
@Bean
public MongoTemplate mongoTemplate() throws Exception {
return new MongoTemplate(mongoDbFactory());
}
}
要创建数据库存储库,只需使用MongoRepository
,如下所示:
public interface UserRepository extends MongoRepository<User,Serializable>{
User findById(String id);
}
答案 2 :(得分:0)
在这种情况下,似乎是在mongod服务器端应用用户身份验证的问题。
需要的身份验证已应用于mongo并已通过
验证db.auth('user','pass');
命令结果为1.但是那时的数据库不存在。之后,首先通过插入虚拟记录创建数据库并分配权限。
应用程序将所有不同的数据库一起用于单元测试用例,在此问题到达时,看起来配置未正确应用。
修正后应用
new MongoClient(serverAddress, Arrays.asList(MongoCredential.createCredential(userName, dbName, password.toCharArray())));
似乎工作正常。然而,同时mongo驱动程序错误有点神秘,没有太多解释导致调试耗时。