0

我正在尝试创建一个通用的 mongo 连接组件,它将与不同的 mongo 数据库实例一起使用。我设法使它与一些代码一起工作,例如

  // Creating a Mongo client 
  MongoClient mongo = new MongoClient( "localhost" , 27017 ); 

  // Creating Credentials 
  MongoCredential credential; 
  credential = MongoCredential.createCredential("sampleUser", "myDb", 
     "password".toCharArray()); 
  System.out.println("Connected to the database successfully");  
  
  // Accessing the database 
  MongoDatabase database = mongo.getDatabase("myDb"); 
  System.out.println("Credentials ::"+ credential); 

我不明白为什么它需要在 2 个地方指定数据库:"myDb"一次在凭证中,一次在它执行getDatabase. 不仅如此,在我的设置中,我还需要在createCredential“admin”上指定一个不同的数据库才能工作。为什么凭据数据库与我将运行查询的数据库不同?

4

1 回答 1

1

当您更深入地检查代码时,您会发现以下令人信服的原因。

这是所有验证器都崩溃的地方。

private void authenticateAll(final InternalConnection internalConnection, final ConnectionDescription connectionDescription) {
        if (connectionDescription.getServerType() != ServerType.REPLICA_SET_ARBITER) {
            for (final Authenticator cur : authenticators) {
                cur.authenticate(internalConnection, connectionDescription);
            }
        }
    }

authenticators包含凭据列表。有四种实现方式。

  1. 默认
  2. 本国的
  3. x509
  4. sasl

“myDb”,一旦在凭证中 - 为什么

此处指定的主要原因是,必须在哪个数据库上执行身份验证命令,因为每个数据库可以有不同的用户名。

executeCommand(getCredential().getSource(), authCommand, connection);

有一次它做一个 getDatabase - 为什么

这是完全不同的。它返回MongoDatabase包含选项的对象read, write concerns, list of collections, create view, create collection

于 2020-08-12T03:29:34.223 回答