I am trying to find a way to create a gui login for a database application that uses MongoDB. The server is 3.6 and the Java driver is 4.1.1. I can connect to the database and perform all CRUD operations via the application. I’m getting a little confused out how to write a simple authentication gui interface. It seems if I provide a bad username/password for access to the specific database, the main application still starts and it seems this is normal. I say normal because it doesn’t seem like there is any authentication until you actually perform an operation on the collection. At the login screen if I pass a bad user/pass I can execute a listcollectionsNames() but its not only until I attempt to get the most recent objectId from a collection that authentication occurs.
My assumption was that using:
public DB(String username, String passwd) {
this.user = username;
this.password = passwd.toCharArray();
database = "test";
System.out.println("Username = " + user);
System.out.println("Password = " + Arrays.toString(password));
credential = MongoCredential.createCredential(user, database, password);
settings = MongoClientSettings.builder()
.credential(credential)
.applyToSslSettings(builder -> {
builder.enabled(true);
builder.invalidHostNameAllowed(false);
})
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("host1", 27017))))
.build();
mongoClient = MongoClients.create(settings);
MongoDataBase db = mongoClient.getDatabase(database);
collection = db.getCollection("myTestCollection");
System.out.println("Last record = " + getLastId());
System.out.println("Current collections:n" + database.listCollectionNames());
}
Would fully authenticate a login, much like mongo shell would.
Searching the internet I have found examples such as:
DB db = mongo.getDB("journaldev");
boolean auth = db.authenticate("pankaj", "pankaj123".toCharArray());
But I can’t find anything similar to this command within the current driver.
Is the only way to verify authentication is to perform an operation and then pass that success/fail to the login gui?
Advertisement
Answer
Decided to just go with:
During the login process it performs the quickest operation (I think):
FindIterable<Document> cursor = collection.find().sort(new Document("_id", -1)).limit(1);
and then pass that success/fail to the login gui.