无法使用java连接在MongoDB 3.0.2中对用户进行身份validation

1 – 在mongo shell中创建用户

> use admin switched to db admin > db.createUser( { user:"tiger", pwd:"secret", roles: [ { role:"readWrite", db:"zoo" } ] } ) Successfully added user: { "user" : "tiger", "roles" : [ { "role" : "readWrite", "db" : "zoo" } ] } 

2 – 从Java连接到数据库

 List seeds = new ArrayList(); seeds.add( new ServerAddress( "remoteserver" )); List credentials = new ArrayList(); credentials.add( MongoCredential.createMongoCRCredential( "tiger", "admin", "secret".toCharArray() ) ); MongoClient mongoClient = new MongoClient( seeds); //, credentials ); MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, "zoo"); 

3 – 插入一行

 mongoTemplate.insert(animal, "animal"); 

4 – 获取此错误(此代码在我不使用身份validation时有效)

 2015-05-13 23:11:36.166 ERROR 67846 --- [nio-8443-exec-4] oaccC[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.mongodb.UncategorizedMongoDbException: { "serverUsed" : "remoteserver:27017" , "ok" : 0.0 , "errmsg" : "auth failed" , "code" : 18}; nested exception is com.mongodb.CommandFailureException: { "serverUsed" : "remoteserver:27017" , "ok" : 0.0 , "errmsg" : "auth failed" , "code" : 18}] with root cause com.mongodb.CommandFailureException: { "serverUsed" : "remoteserver:27017" , "ok" : 0.0 , "errmsg" : "auth failed" , "code" : 18} at com.mongodb.CommandResult.getException(CommandResult.java:76) at com.mongodb.CommandResult.throwOnError(CommandResult.java:131) at com.mongodb.DBPort$NativeAuthenticator.authenticate(DBPort.java:652) at com.mongodb.DBPort.authenticate(DBPort.java:364) at com.mongodb.DBPort.checkAuth(DBPort.java:375) at com.mongodb.DBTCPConnector.doOperation(DBTCPConnector.java:206) at com.mongodb.DBCollectionImpl.writeWithCommandProtocol(DBCollectionImpl.java:424) at com.mongodb.DBCollectionImpl.insertWithCommandProtocol(DBCollectionImpl.java:389) at com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:188) at com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:167) at com.mongodb.DBCollection.insert(DBCollection.java:93) at com.mongodb.DBCollection.insert(DBCollection.java:78) at com.mongodb.DBCollection.insert(DBCollection.java:120) at org.springframework.data.mongodb.core.MongoTemplate$8.doInCollection(MongoTemplate.java:904) at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:410) at org.springframework.data.mongodb.core.MongoTemplate.insertDBObject(MongoTemplate.java:899) at org.springframework.data.mongodb.core.MongoTemplate.doInsert(MongoTemplate.java:721) at org.springframework.data.mongodb.core.MongoTemplate.insert(MongoTemplate.java:676) 

稍微挖掘一下,我发现Mongo 3不喜欢挑战 – 反应并喜欢’ MongoCredential.createScramSha1Credential

 List seeds = new ArrayList(); seeds.add( new ServerAddress( "remoteServer" )); List credentials = new ArrayList(); credentials.add( MongoCredential.createScramSha1Credential( "username", "adminDatabase", "password".toCharArray() ) ); MongoClient mongoClient = new MongoClient( seeds, credentials ); MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, "applicationDatabase"); mongoTemplate = new MongoTemplate(mongoDbFactory); 

当使用与artefactId“spring-boot-starter-data-mongodb”的maven依赖时, MongoCredential.createScramSha1Credential不可用。

所以这就是我必须做的事情:

A)在pom.xml中包含对mongodb的maven依赖:

  org.mongodb mongo-java-driver 3.4.0  

B)使用user4898172的解决方案( MongoCredential.createScramSha1Credential

 public Mongo mongo() throws Exception { List credentials = new ArrayList<>(); credentials.add(MongoCredential.createScramSha1Credential(username, database, password.toCharArray())); return new MongoClient(new ServerAddress(host, port), credentials); } 

这两个变化帮助我解决了Exeption:

com.mongodb.CommandFailureException:{“serverUsed”:“remoteserver:27017”,“ok”:0.0,“errmsg”:“auth failed”,“code”:18}

(我使用的是MongoDB服务器版本:3.4.0)

mongodb github站点也是实现细节的一个很好的参考。