【发布时间】:2014-11-21 22:02:14
【问题描述】:
我正在尝试使用 java 驱动程序 v 2.12 在 MongoDB 2.6 中创建一个身份验证数据库。 特别是我需要创建一个访问管理员集合的用户。 有什么建议吗? 谢谢。
【问题讨论】:
我正在尝试使用 java 驱动程序 v 2.12 在 MongoDB 2.6 中创建一个身份验证数据库。 特别是我需要创建一个访问管理员集合的用户。 有什么建议吗? 谢谢。
【问题讨论】:
这是我的解决方案:
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();
}
【讨论】:
在 Java 代码中执行此操作并不是最好的方法,除了非常罕见的用例(为 MongoDB 编写管理应用程序)之外,即使是我会强烈反对的用例。
首先,您的应用程序需要极高的权限,即管理员数据库上的userAdminAnyDatabase 或userAdmin,它们或多或少授予相同的权限:随意创建超级用户。换句话说:这段代码会有很高的安全风险。
在数据库上授予角色和权限是一项管理任务,出于充分的理由应该将其与任意用户可访问的应用程序分离。
根本不可能从客户端激活身份验证。有问题的 mongod 实例必须在启用身份验证的情况下启动。此外,您必须先保存以创建具有上述角色的用户,然后才能让您的应用程序管理用户。问题:您必须将该用户的密码存储在某处。除非您对其进行加密,否则您基本上会以明文形式存储 MongoDB 数据库和集群的最强大的密码。如果你加密它,你必须在某个时候以一种安全的方式将用于解密的密钥传递给你的应用程序。而这一切都是为了打破最佳实践(“关注点分离”)?
【讨论】: