簡體   English   中英

使用 Java 在 MongoDB 中創建數據庫用戶

[英]Create a database user in MongoDB using Java

我對 MongoDB 很陌生。 我正在嘗試通過 Java 驅動程序為 MongoDB 中的數據庫創建用戶。 我正在使用mongo-java-driver 3.0.1版本。 我在谷歌上搜索,我沒有找到相關的答案。 我看到mongo-java-driver 2.13.0 中有直接方法,但在最新版本中已棄用。 我嘗試使用以下代碼創建用戶,但出現異常。

代碼:

MongoClient mongoClient = new MongoClient("127.0.0.1","27017");
MongoDatabase mongoDatabase = this.mongoClient
                        .getDatabase(doc);
BasicDBObject commandArguments = new BasicDBObject();
commandArguments.put("user", mongoDatabase.getName());
commandArguments.put("pwd", "Cip#erCloud@123");
String[] roles = { "readWrite" };
commandArguments.put("roles", roles);
BasicDBObject command = new BasicDBObject("createUser",
                        commandArguments.toString());
mongoDatabase.runCommand(command);

例外:

com.mongodb.MongoCommandException: Command failed with error 2: 'Must provide a 'pwd' field for all user documents, except those with '$external' as the user's source db' on server 127.0.0.1:27017. 
The full response is { "ok" : 0.0, "errmsg" : "Must provide a 'pwd' field for all user documents, except those with '$external' as the user's source db", "code" : 2 }

以下是我的問題:

  1. 如何為數據庫創建用戶。?
  2. 如何獲取數據庫的所有用戶。?

注意:我使用的是 JAVA 庫。

任何人都可以幫我解決這個問題。 我在這里卡住了。

感謝和問候, 阿馬爾

你能試試這個來創建用戶嗎:

    MongoClient mongo = new MongoClient("localhost", 27017);
    MongoDatabase db =  mongo.getDatabase("testDB");
    Map<String, Object> commandArguments = new HashMap<>();
    commandArguments.put("createUser", "dev");
    commandArguments.put("pwd", "password123");
    String[] roles = { "readWrite" };
    commandArguments.put("roles", roles);
    BasicDBObject command = new BasicDBObject(commandArguments);
    db.runCommand(command);

兩種方式都不適合我。 但是這種方式有效:

 final MongoDatabase db = mongoClient.getDatabase("myDatabase");
 final BasicDBObject createUserCommand = new BasicDBObject("createUser", "myuser").append("pwd", "mypassword").append("roles",
                            Collections.singletonList(new BasicDBObject("role", "dbOwner").append("db", "myDatabase")));
            db.runCommand(createUserCommand);

我需要在測試用例中創建一個用戶。 如果用戶已經存在,運行 createUser 命令將拋出異常。 在嘗試創建用戶之前,我添加了一些代碼來刪除用戶(如果用戶存在),以便異常不會出現在單元測試日志中。 添加此代碼然后捕獲異常,驗證它是否適用於現有用戶帳戶並忽略它對我來說更容易。

要使用它,您需要設置用戶名、密碼和 TEST_DATABASE_NAME。

    Document result = null;
    MongoDatabase db = mongo.getDatabase(TEST_DATABASE_NAME);
    BasicDBObject getUsersInfoCommand = new BasicDBObject("usersInfo",
            new BasicDBObject("user", username).append("db", TEST_DATABASE_NAME));
    BasicDBObject dropUserCommand = new BasicDBObject("dropUser", username);
    BasicDBObject createUserCommand = new BasicDBObject("createUser", username).append("pwd", password).append("roles",
                        Collections.singletonList(new BasicDBObject("role", "dbOwner").append("db", TEST_DATABASE_NAME)));

    // If test user exists from a previous run, drop it
    result = db.runCommand(getUsersInfoCommand);
    ArrayList users = (ArrayList) result.get("users");
    if (!users.isEmpty()) {
        db.runCommand(dropUserCommand);
    }

    db.runCommand(createUserCommand);

更好的是在測試完成后刪除用戶,但我在 @AfterClass 方法中有代碼,它實際上是此測試的一部分,這會使共享此代碼示例更加復雜。

關於使用 HashMap 的 Devender 答案中的代碼:

Map<String, Object> commandArguments = new HashMap<>();

HashMap 在迭代時不保證項目的順序,因此如果假設“角色”首先出現,那么 runCommand 請求可能會失敗。 我遇到了那個問題。

使用 LinkedHashMap 而不是 HashMap<> 解決了這個問題,因為它通常按照插入的順序進行迭代。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM