【问题标题】:Authentication during connection to MongoDB server instance using Java使用 Java 连接到 MongoDB 服务器实例期间的身份验证
【发布时间】:2020-02-15 05:29:36
【问题描述】:

是否可以制作类似的东西:

MongoClient mongo = new MongoClient(ip, port, usrName, password)

在 JAVA 中类似于 MongoVUE 或其他基于 SQL 的数据库的身份验证方法。

在连接到数据库实例期间完成身份验证。

我在MongoClient java doc 中没有看到合适的实例方法

还有Authentication (Optional) Official docs的路

不符合我的目标,因为它需要更改我的应用程序中现在不使用身份验证的所有现有查询方法。

Authenticate to MongoDB with the Java Driver 中的方式看起来正是我需要的,但在 mongo 2.10.1 发行版中没有 com.mongodb.MongoCredential 类。

【问题讨论】:

  • 如何为 Mongo 客户端的实例化创建一个包装器?

标签: java mongodb authentication mongovue


【解决方案1】:

您不需要更改所有现有查询,只需要更改建立 MongoClient 的逻辑。大多数应用程序都以某种 Singleton 的形式执行此操作,因此添加身份验证只是修改 Singleton 的问题。令人痛心的是,没有一个只需要字符串的签名,用户名密码的字符串,但它的 Mongo Java API,习惯了失望。

您可以选择获得最短签名的 MongoURI 路径...

MongoClient mongo = new MongoClient(
  new MongoClientURI( "mongodb://app_user:bestPo55word3v3r@localhost/data" )
);

或者使用更详细的 List 路径

List<ServerAddress> seeds = new ArrayList<ServerAddress>();
seeds.add( new ServerAddress( "localhost" );
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
credentials.add(
    MongoCredential.createMongoCRCredential(
        "app_user",
        "data",
        "bestPo55word3v3r".toCharArray()
    )
);
MongoClient mongo = new MongoClient( seeds, credentials );

【讨论】:

  • 谢谢。请问,哪个 jar 包含 MongoCredential 类型的定义?
  • MongoClient 在 mongo-java-driver-2.11.3.jar 中,但 JavaDocs 说它从 2.10.0 开始就存在了。我的项目通过 gradle 获取 JAR。
  • 我很困惑。 mongo-2.10.1.jar 中有 MongoClient,但没有 MongoCredential。
  • 无赖。你完蛋了。如果您坚持使用 2.10.1,那么 MongoClientURI 是您通往 Mongo 身份验证的唯一途径。再次查看 JavaDocs,MongoCredential 似乎出现在 2.11.0:api.mongodb.org/java/2.11.3/com/mongodb/MongoCredential.html。我们在这里运行 2.11.4 并通过 MongoCredentials 进行身份验证。
  • @Bob Kuhar:接受的解决方案中的端口号port呢?
【解决方案2】:

继 Bob Kuhar 接受的答案之后,在 Mongo3 中,机制已从质询响应更改为 SHA1,如代码 sn-p 所示。我需要更新代码sn-p如下:

...
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
...

// Manage the mongo db connection...
List<ServerAddress> seeds = new ArrayList<ServerAddress>();
seeds.add( new ServerAddress(configuration.getMongoHost(), configuration.getMongoPort() ));
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
credentials.add(
    MongoCredential.createScramSha1Credential(
        configuration.getMongoUser(),
        configuration.getMongoDb(),
        configuration.getMongoPassword().toCharArray()
    )
);
MongoClient mongo = new MongoClient( seeds, credentials );

【讨论】:

    【解决方案3】:

    我需要连接多个 HOST,还需要连接handle authentication

    使用version 3.12

    List<ServerAddress> seeds = new ArrayList<>();
    seeds.add(new ServerAddress("localhost"))
    
    credential = MongoCredential.createScramSha1Credential(
          user,
          db,
          pass.toCharArray()
    );
    
    mongoClient = MongoClients.create(
          MongoClientSettings.builder()
               .applyToClusterSettings(builder -> 
                     builder.hosts(seeds))
               .credential(credential)
               .build());
    

    【讨论】:

      猜你喜欢
      • 2015-06-18
      • 2017-09-05
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 2018-06-05
      • 2012-06-20
      相关资源
      最近更新 更多