From cf131aaa7eaf5a323859341d28f16b3e6ab7b254 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Sun, 6 May 2012 20:14:43 +0200 Subject: [PATCH] DATAMONGO-441 - Improved MongoDBUtils API. Use UserCredentials value object instead of low level String and char[] for username and password. Adapted clients accordingly. --- .../CannotGetMongoDbConnectionException.java | 43 +++++++++++-------- .../data/mongodb/core/MongoAdmin.java | 4 +- .../data/mongodb/core/MongoDbUtils.java | 40 +++++++++-------- .../mongodb/core/SimpleMongoDbFactory.java | 7 +-- .../data/mongodb/monitor/AbstractMonitor.java | 6 +-- 5 files changed, 56 insertions(+), 44 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/CannotGetMongoDbConnectionException.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/CannotGetMongoDbConnectionException.java index 5c291db47..6d21b8cf7 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/CannotGetMongoDbConnectionException.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/CannotGetMongoDbConnectionException.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,42 +16,51 @@ package org.springframework.data.mongodb; import org.springframework.dao.DataAccessResourceFailureException; +import org.springframework.data.authentication.UserCredentials; +/** + * Exception being thrown in case we cannot connect to a MongoDB instance. + * + * @author Oliver Gierke + */ public class CannotGetMongoDbConnectionException extends DataAccessResourceFailureException { - private String username; - - private char[] password; - - private String database; + private final UserCredentials credentials; + private final String database; private static final long serialVersionUID = 1172099106475265589L; public CannotGetMongoDbConnectionException(String msg, Throwable cause) { super(msg, cause); + this.database = null; + this.credentials = UserCredentials.NO_CREDENTIALS; } public CannotGetMongoDbConnectionException(String msg) { - super(msg); + this(msg, null, UserCredentials.NO_CREDENTIALS); } - public CannotGetMongoDbConnectionException(String msg, String database, String username, char[] password) { + public CannotGetMongoDbConnectionException(String msg, String database, UserCredentials credentials) { super(msg); - this.username = username; - this.password = password == null ? null : password.clone(); this.database = database; + this.credentials = credentials; } - public String getUsername() { - return username; - } - - public char[] getPassword() { - return password; + /** + * Returns the {@link UserCredentials} that were used when trying to connect to the MongoDB instance. + * + * @return + */ + public UserCredentials getCredentials() { + return this.credentials; } + /** + * Returns the name of the database trying to be accessed. + * + * @return + */ public String getDatabase() { return database; } - } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoAdmin.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoAdmin.java index 14d88def5..2406c7590 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoAdmin.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoAdmin.java @@ -15,6 +15,7 @@ */ package org.springframework.data.mongodb.core; +import org.springframework.data.authentication.UserCredentials; import org.springframework.jmx.export.annotation.ManagedOperation; import org.springframework.jmx.export.annotation.ManagedResource; import org.springframework.util.Assert; @@ -78,11 +79,10 @@ public class MongoAdmin implements MongoAdminOperations { * @param password The password to use */ public void setPassword(String password) { - this.password = password; } DB getDB(String databaseName) { - return MongoDbUtils.getDB(mongo, databaseName, username, password == null ? null : password.toCharArray()); + return MongoDbUtils.getDB(mongo, databaseName, new UserCredentials(username, password)); } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoDbUtils.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoDbUtils.java index 2600e3846..5213ef5cd 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoDbUtils.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoDbUtils.java @@ -17,6 +17,7 @@ package org.springframework.data.mongodb.core; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.data.authentication.UserCredentials; import org.springframework.data.mongodb.CannotGetMongoDbConnectionException; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; @@ -49,29 +50,32 @@ public abstract class MongoDbUtils { /** * Obtains a {@link DB} connection for the given {@link Mongo} instance and database name * - * @param mongo The {@link Mongo} instance - * @param databaseName The database name - * @return The {@link DB} connection + * @param mongo the {@link Mongo} instance, must not be {@literal null}. + * @param databaseName the database name, must not be {@literal null} or empty. + * @return the {@link DB} connection */ public static DB getDB(Mongo mongo, String databaseName) { - return doGetDB(mongo, databaseName, null, null, true); + return doGetDB(mongo, databaseName, UserCredentials.NO_CREDENTIALS, true); } /** * Obtains a {@link DB} connection for the given {@link Mongo} instance and database name * - * @param mongo The {@link Mongo} instance - * @param databaseName The database name - * @param username The username to authenticate with - * @param password The password to authenticate with - * @return The {@link DB} connection + * @param mongo the {@link Mongo} instance, must not be {@literal null}. + * @param databaseName the database name, must not be {@literal null} or empty. + * @param credentials the credentials to use, must not be {@literal null}. + * @return the {@link DB} connection */ - public static DB getDB(Mongo mongo, String databaseName, String username, char[] password) { - return doGetDB(mongo, databaseName, username, password, true); + public static DB getDB(Mongo mongo, String databaseName, UserCredentials credentials) { + + Assert.notNull(mongo, "No Mongo instance specified!"); + Assert.hasText(databaseName, "Database name must be given!"); + Assert.notNull(credentials, "Credentials must not be null, use UserCredentials.NO_CREDENTIALS!"); + + return doGetDB(mongo, databaseName, credentials, true); } - public static DB doGetDB(Mongo mongo, String databaseName, String username, char[] password, boolean allowCreate) { - Assert.notNull(mongo, "No Mongo instance specified"); + private static DB doGetDB(Mongo mongo, String databaseName, UserCredentials credentials, boolean allowCreate) { DbHolder dbHolder = (DbHolder) TransactionSynchronizationManager.getResource(mongo); if (dbHolder != null && !dbHolder.isEmpty()) { @@ -94,13 +98,15 @@ public abstract class MongoDbUtils { LOGGER.trace("Getting Mongo Database name=[" + databaseName + "]"); DB db = mongo.getDB(databaseName); - boolean credentialsGiven = username != null && password != null; + boolean credentialsGiven = credentials.hasUsername() && credentials.hasPassword(); if (credentialsGiven && !db.isAuthenticated()) { // Note, can only authenticate once against the same com.mongodb.DB object. - if (!db.authenticate(username, password)) { + String username = credentials.getUsername(); + String password = credentials.hasPassword() ? credentials.getPassword() : null; + + if (!db.authenticate(username, password == null ? null : password.toCharArray())) { throw new CannotGetMongoDbConnectionException("Failed to authenticate to database [" + databaseName - + "], username = [" + username + "], password = [" + new String(password) + "]", databaseName, username, - password); + + "], username = [" + username + "], password = [" + password + "]", databaseName, credentials); } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/SimpleMongoDbFactory.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/SimpleMongoDbFactory.java index 4e9711d4d..d85083cfd 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/SimpleMongoDbFactory.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/SimpleMongoDbFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -115,10 +115,7 @@ public class SimpleMongoDbFactory implements DisposableBean, MongoDbFactory { Assert.hasText(dbName, "Database name must not be empty."); - String username = credentials.getUsername(); - char[] password = credentials.hasPassword() ? credentials.getPassword().toCharArray() : null; - - DB db = MongoDbUtils.getDB(mongo, dbName, username, password); + DB db = MongoDbUtils.getDB(mongo, dbName, credentials); if (writeConcern != null) { db.setWriteConcern(writeConcern); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/monitor/AbstractMonitor.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/monitor/AbstractMonitor.java index 2a958750e..26b23449b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/monitor/AbstractMonitor.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/monitor/AbstractMonitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2011 the original author or authors. + * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package org.springframework.data.mongodb.monitor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.data.authentication.UserCredentials; import org.springframework.data.mongodb.core.MongoDbUtils; import com.mongodb.CommandResult; @@ -52,7 +53,6 @@ public abstract class AbstractMonitor { * @param password The password to use */ public void setPassword(String password) { - this.password = password; } @@ -66,6 +66,6 @@ public abstract class AbstractMonitor { } public DB getDb(String databaseName) { - return MongoDbUtils.getDB(mongo, databaseName, username, password == null ? null : password.toCharArray()); + return MongoDbUtils.getDB(mongo, databaseName, new UserCredentials(username, password)); } }