使用Java在MongoDB中创建数据库用户

6
我是一名新手,对 MongoDB 不太熟悉。我正在尝试通过 Java Driver 在 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库。

有人能帮我吗?我卡在这里了。

谢谢 & 致意,Amar

4个回答

12

请尝试使用以下步骤创建用户:

    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);

谢谢,它正在工作。 :) - Amar

5

两种方法对我都没有用。但是这种方法有效:

 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);

1

我需要在一个测试用例中创建一个用户。如果该用户已经存在,运行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方法中,实际上是这个测试的一部分,如果要分享这个代码示例会更加复杂。

0

关于Devender答案中使用HashMap的代码:

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

当迭代HashMap时,它不保证项目的顺序,因此如果'roles'恰好排在第一位,则runCommand请求可能会失败。我遇到了这个问题。

使用LinkedHashMap而不是HashMap<>解决了这个问题,因为它通常按插入顺序迭代。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接