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

时间:2015-05-28 11:27:54

标签: java mongodb

我是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. 如何获取数据库的所有用户。?
  3. 注意:我正在使用JAVA库。

    请有人帮我解决这个问题。我卡在这里。

    谢谢&此致,Amar

4 个答案:

答案 0 :(得分:8)

你可以试试这个来创建用户:

Error in `[.data.frame`(out, , obsLevels, drop = FALSE) : 
  undefined columns selected

答案 1 :(得分:3)

这两种方式对我都不起作用。但是这种方式有效:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

Map commandArguments = new HashMap <>();

HashMap不能保证迭代时项目的顺序,因此,如果说“角色”最先出现,则runCommand请求可能会失败。 我遇到了这个问题。

使用LinkedHashMap代替HashMap <>解决了该问题,因为它通常按插入顺序进行迭代。