Сбой аутентификации новой базы данных в программе MongoDB
У меня есть приложение базы данных удаленных арендаторов, использующее MongoDB с включенной аутентификацией. Во время выполнения мне нужно программно создать новую базу данных клиентов, создать нового пользователя базы данных клиентов, создать новую коллекцию и записать в новую базу данных метаданные пользователя. Моя проблема в том, что я неправильно настраиваю авторизацию пользователя-арендатора. Я могу создать новую базу данных арендаторов и пользователя базы данных с учетными данными "readWrite". Я также могу правильно написать документ в коллекцию "пользователи". Если я использую свои учетные данные администратора, я могу получить доступ к базе данных арендаторов и проверить документ пользователя без проблем. Однако, если я попытаюсь позднее получить доступ к базе данных с помощью вновь созданных учетных данных пользователя базы данных, я получу исключение неверных учетных данных пользователя. Ниже мой код, который создает новую базу данных арендаторов,
MongoCredential adminCredentials = MongoCredential
.createCredential(adminuid, admindb, adminpw.toCharArray());
ServerAddress adminSA = new ServerAddress(mongoConnectionUri, mongoPort);
// Create the Mongo Password Vault Client & Document Template
MongoClient adminclient = new MongoClient(adminSA, Arrays.asList(adminCredtials)):
MongoClient adminclient MongoClient(adminSA,Arrays.asList(adminCredentials));
DB tenant = adminclient.getDB(tenantdb);
// Create pwvdb user
DBObject pwvdbrole = new BasicDBObject();
pwvdbrole.put("role", pwvrole);
pwvdbrole.put("db", pwvdb);
ArrayList<DBObject> pwvdbroles = new ArrayList<DBObject>();
pwvdbroles.add(pwvdbrole);
DBObject pwvaultcmd = new BasicDBObject();
pwvaultcmd.put("createUser", pwvuid);
pwvaultcmd.put("pwd", pwvpw);
pwvaultcmd.put("roles", pwvdbroles);
CommandResult result = tenant.command(pwvaultcmd);
if (result.ok()) {
System.out.println("Tenant Credentials: OK");
} else {
System.out.println("Tenant Credentials Error: " +
result.getErrorMessage());
}
// Create users Collection
DBCollection tenantCollection =
tenant.getCollection(tenantcollection);
// Create user default credentials & update user collection
BasicDBObject userdocument = new BasicDBObject();
userdocument.put("firstname", userfirstname);
userdocument.put("lastname", userlastname);
userdocument.put("email", useremail);
userdocument.put("username", username);
userdocument.put("password", pwencoder.encode(userpassword));
userdocument.put("role", Integer.parseInt(userrole));
// Create admin web portal users uid/pw
tenantCollection.insert(userdocument);
pwvclient.close();
Поскольку клиент является удаленным, для учетных данных я использую свой ID администратора, pw и db. Однако клиент клиента MongoDB настраивается с использованием нового имени базы данных клиента. Возможно, я ошибаюсь, но не знаю, как получить удаленный доступ к базе данных с пользователем, которого я еще не создал. Эти базы данных создаются во время выполнения, и я не знаю имени пользователя-арендатора при запуске приложения.
2 ответа
Вот что я сделал, чтобы заставить его работать. Две ключевые вещи, на которые я хочу обратить внимание, - это шаблоны MongoDB adminops и testops. Обратите внимание, что в adminops я использовал свои учетные данные администратора MongoDB, но указал на testdb. В testops я использовал свои новые учетные данные testdb и также указал на testdb. Моя ошибка была с админопсом. Я использовал admindb, который был неверным. Также было немного сложно получить роль obobj и cmd, но я равномерно понял это.
package com.belcan;
import java.util.ArrayList;
import java.util.Arrays;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import com.mongodb.BasicDBObject;
import com.mongodb.CommandResult;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
public class PreConfigTestApplication implements CommandLineRunner {
public static void main(String[] args) {
// Fire off Spring Boot & Embedded Linux
SpringApplication.run(PreConfigTestApplication.class, args);
}
@Override
public void run(String...args) throws Exception {
String testdb = "testdb";
String testuid = "skm";
String testpw = "password";
// Set up credentials
MongoCredential admincredentials = MongoCredential
.createCredential(adminuid, admindb, adminpw.toCharArray());
ServerAddress adminsa = new ServerAddress(mongoConnectionUri, mongoPort);
// Create the Mongo Client & Document Template
MongoClient adminclient = new MongoClient(adminsa,Arrays.asList(admincredentials));
MongoOperations adminops = new MongoTemplate(adminclient, testdb);
// First create new user
DBObject roleobj = new BasicDBObject();
roleobj.put("role", "readWrite");
roleobj.put("db", "testdb");
ArrayList<DBObject> array = new ArrayList<DBObject>();
array.add(roleobj);
DBObject cmd = new BasicDBObject();
cmd.put("createUser", testuid);
cmd.put("pwd", testpw);
cmd.put("roles", array);
// Create new User
CommandResult result = (CommandResult) adminops.executeCommand(cmd);
// check to see if command is ok
if (result.ok()) {
System.out.println("createUser Command: OK");
} else {
System.out.println("createUser Error:" + result.getErrorMessage());
}
// switch to testdb
MongoOperations testops = new MongoTemplate(adminclient, testdb);
// Create the user object
User user = new User();
user.setFirstname("mickey");
user.setLastname("mouse");
user.setEmail("mmouse@gmail.com");
user.setUsername("mmouse");
user.setPassword("mmouse1");
user.setRole("USER");
user.setStatus("ACTIVE");
// Now save it
testops.save(user, "users");
// Close Database Connection
adminclient.close();
//
// Now see if we can open the file with the new uid/pw
//
// Set up credentials
MongoCredential testcredentials = MongoCredential
.createCredential(testuid, testdb, testpw.toCharArray());
ServerAddress testsa = new ServerAddress(mongoConnectionUri, mongoPort);
// Create the Mongo Client & Document Template
MongoClient testclient = new MongoClient(testsa,Arrays.asList(testcredentials));
MongoOperations myops = new MongoTemplate(testclient, testdb);
User myuser = new User();
myuser.setFirstname("Daffy");
myuser.setLastname("Duck");
myuser.setEmail("dduck@gmail.com");
myuser.setUsername("dduck");
myuser.setPassword("dduck1");
myuser.setRole("USER");
myuser.setStatus("ACTIVE");
// Now save it
myops.save(myuser,"users");
// Lets print it out
System.out.println("Print Results");
ArrayList<User> userout = (ArrayList<User>) myops.findAll(User.class, "users");
for (int i = 0; i < userout.size(); i++) {
System.out.println(userout.get(i));
}
System.out.println("\n\nAll Done....");
// Close the database
testclient.close();
}
// MongoDB Connection URI
@Value("${spring.data.mongodb.uri}")
private String mongoConnectionUri;
// MongoDB Connection Port
@Value("${spring.data.mongodb.port}")
private int mongoPort;
// MongoDB userid
@Value("${mongo.server.admin.db}")
private String admindb;
// MongoDB admin password
@Value("${mongo.server.admin.pw}")
private String adminpw;
// MongoDB admin userid
@Value("${mongo.server.admin.uid}")
private String adminuid;
}
Есть два разных места для пользовательских разрешений, которые могут быть сбиты с толку. Оба могут быть сделаны динамически в вашем коде.
Роли пользователя в клиентской БД
Самый простой вариант - создать пользователя, которого вы хотите, в БД клиента. Вы должны использовать вызов runCommand со структурой документа для команды createUser, описанной здесь. Вы бы создали этого пользователя в клиентской БД. Роль должна быть readWrite или любая другая задокументированная.
Затем позже вы будете аутентифицироваться для пользователя и пароля для той же БД.
Вы также можете централизовать все свои пользовательские функции управления в DB администратора с каждым вызовом createUser, перечисляя роли для каждой пары DB/ роль, которую вы хотите. Дайте мне знать, если вам нужно это объяснение. Он работает в основном так же, как для создания пользователей и аутентификации на этой базе данных. Затем вы переключаетесь на ту БД, к которой хотите получить доступ, на том же MongoClient.
Я не смог опубликовать 2 другие полезные ссылки из-за странного ограничения на размещение более 2 ссылок, если я недостаточно активен (10 репутации).