Сбой аутентификации новой базы данных в программе 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 репутации).

Другие вопросы по тегам