我尝试使用java驱动程序v 2.12在MongoDB 2.6中创建一个身份验证数据库。 特别是我需要创建一个访问管理集合的用户。 有什么建议吗? 感谢。
答案 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的管理应用程序),我甚至会强烈建议。
首先,您的应用程序需要极高的权限,即管理数据库上的userAdminAnyDatabase
或userAdmin
,它们或多或少地授予相同的权限:随意创建超级用户。换句话说:这段代码存在很高的安全风险。
授予数据库的角色和权限是一项管理任务,并且有充分的理由应该与任意用户可访问的应用程序分离。
简单地从客户端激活身份验证是不可能的。必须在启用身份验证的情况下启动有问题的mongod实例。此外,您必须先保存以创建具有上述角色的用户,然后才能让您的应用管理用户。问题:您必须在某处存储该用户的密码。除非你对它进行加密,否则你基本上都会以明文形式存储MongoDB数据库和集群最强大的密码。如果您对其进行加密,则必须在某个时刻以安全的方式将密钥传递给您的应用程序。所有这些都打破了最佳实践("关注点分离")?