From 357818c716c7a6629892e4bd28766ce47780abfc Mon Sep 17 00:00:00 2001 From: Mark Pollack Date: Sat, 9 Apr 2011 12:44:10 -0400 Subject: [PATCH] DATADOC-51 - Enabling security on MongoTemplate results in the driver throwing "java.lang.IllegalStateException: can't call authenticate twice on the same DBObject" --- .../CannotGetMongoDbConnectionException.java | 28 ++++++++++++++++++- .../data/document/mongodb/MongoDbUtils.java | 11 ++++++-- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/CannotGetMongoDbConnectionException.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/CannotGetMongoDbConnectionException.java index d9e2505ca..cafcd7541 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/CannotGetMongoDbConnectionException.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/CannotGetMongoDbConnectionException.java @@ -19,13 +19,39 @@ import org.springframework.dao.DataAccessResourceFailureException; public class CannotGetMongoDbConnectionException extends DataAccessResourceFailureException { + private String username; + + private char[] password; + + private String database; + private static final long serialVersionUID = 1172099106475265589L; public CannotGetMongoDbConnectionException(String msg, Throwable cause) { super(msg, cause); } - + public CannotGetMongoDbConnectionException(String msg) { super(msg); } + + public CannotGetMongoDbConnectionException(String msg, String database, String username, char[] password2) { + super(msg); + this.username = username; + this.password = password2; + this.database = database; + } + + public String getUsername() { + return username; + } + + public char[] getPassword() { + return password; + } + + public String getDatabase() { + return database; + } + } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoDbUtils.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoDbUtils.java index 0e0c9d31b..b0decf66a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoDbUtils.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoDbUtils.java @@ -16,6 +16,7 @@ package org.springframework.data.document.mongodb; +import com.mongodb.CommandResult; import com.mongodb.DB; import com.mongodb.Mongo; import org.apache.commons.logging.Log; @@ -92,10 +93,14 @@ public abstract class MongoDbUtils { LOGGER.trace("Getting Mongo Database name=["+databaseName+"]"); DB db = mongo.getDB(databaseName); + boolean credentialsGiven = username != null && password != null; - - if (credentialsGiven && !db.authenticate(username, password)) { - throw new CannotGetMongoDbConnectionException("Failed to authenticate with Mongo using the given credentials"); + if (credentialsGiven && !db.isAuthenticated()) { + //Note, can only authenticate once against the same com.mongodb.DB object. + if (!db.authenticate(username, password)) { + throw new CannotGetMongoDbConnectionException("Failed to authenticate to database [" + databaseName + + "], username = [" + username + "], password = [" + new String(password) + "]", databaseName, username, password ); + } } // Use same Session for further Mongo actions within the transaction.