MongoDB:如何通过java驱动程序创建经过身份验证的数据库

时间:2014-11-21 11:57:08

标签: java mongodb

我尝试使用java驱动程序v 2.12在MongoDB 2.6中创建一个身份验证数据库。 特别是我需要创建一个访问管理集合的用户。 有什么建议吗? 感谢。

2 个答案:

答案 0 :(得分:1)

这是我的解决方案:

MongoClient mcAdmin = new MongoClient(
            configuration.getServerAddresses(),
            Arrays.asList(MongoCredential.createMongoCRCredential(
                    MONGODB_ADMIN_USERNAME, "admin",
                    MONGODB_ADMIN_PASSWORD.toCharArray())));
    try {
        mcAdmin.setWriteConcern(WriteConcern.JOURNALED);
        DB db = mcAdmin.getDB(userDbName);
        BasicDBObject commandArguments = new BasicDBObject();
        commandArguments.put("user", userUsername);
        commandArguments.put("pwd", userPassword);
        String[] roles = { "readWrite" };
        commandArguments.put("roles", roles);
        BasicDBObject command = new BasicDBObject("createUser",
                commandArguments);
        db.command(command);
    } finally {
        mcAdmin.close();
    }

答案 1 :(得分:0)

在Java代码中执行此操作并不是最好的方法,除了非常罕见的用例(编写MongoDB的管理应用程序),我甚至会强烈建议。

安全风险

首先,您的应用程序需要极高的权限,即管理数据库上的userAdminAnyDatabaseuserAdmin,它们或多或少地授予相同的权限:随意创建超级用户。换句话说:这段代码存在很高的安全风险。

授予数据库的角色和权限是一项管理任务,并且有充分的理由应该与任意用户可访问的应用程序分离。

技术问题

简单地从客户端激活身份验证是不可能的。必须在启用身份验证的情况下启动有问题的mongod实例。此外,您必须先保存以创建具有上述角色的用户,然后才能让您的应用管理用户。问题:您必须在某处存储该用户的密码。除非你对它进行加密,否则你基本上都会以明文形式存储MongoDB数据库和集群最强大的密码。如果您对其进行加密,则必须在某个时刻以安全的方式将密钥传递给您的应用程序。所有这些都打破了最佳实践("关注点分离")?