MongoDB:如何通过java驱动程序创建经过身份验证的数据库 6 月,3 周 Questions & Answers 1643 我正在尝试使用java驱动程序v2.12在MongoDB 2.6中创建一个身份验证数据库。 特别是我需要创建一个访问管理员集合的用户。 有什么建议吗? 谢谢
# 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(); }
# 2 楼答案 在Java代码中这样做并不是最好的方法,除了非常罕见的用例(为MongoDB编写管理应用程序)之外,甚至还有一个我强烈反对的用例 安全风险 首先,您的应用程序需要极高的权限,即管理数据库上的^{}或^{},这或多或少授予相同的权限:随意创建超级用户。换言之:此代码将具有很高的安全风险 授予数据库的角色和权限是一项管理任务,出于充分的理由,应该与任意用户可访问的应用程序分离 技术问题 从客户端激活身份验证是不可能的。相关mongod实例必须在启用身份验证的情况下启动。此外,在让应用程序管理用户之前,您必须先保存以创建具有上述角色的用户。问题是:您必须将该用户的密码存储在某个位置。除非您对其进行加密,否则您基本上会将MongoDB数据库和集群最强大的密码存储在明文中。如果对其进行加密,则必须在某个时刻以安全的方式将解密密钥传递给应用程序。所有这些都是为了打破最佳实践(“关注点分离”)
# 1 楼答案
以下是我的解决方案:
# 2 楼答案
在Java代码中这样做并不是最好的方法,除了非常罕见的用例(为MongoDB编写管理应用程序)之外,甚至还有一个我强烈反对的用例
安全风险
首先,您的应用程序需要极高的权限,即管理数据库上的^{} 或^{} ,这或多或少授予相同的权限:随意创建超级用户。换言之:此代码将具有很高的安全风险
授予数据库的角色和权限是一项管理任务,出于充分的理由,应该与任意用户可访问的应用程序分离
技术问题
从客户端激活身份验证是不可能的。相关mongod实例必须在启用身份验证的情况下启动。此外,在让应用程序管理用户之前,您必须先保存以创建具有上述角色的用户。问题是:您必须将该用户的密码存储在某个位置。除非您对其进行加密,否则您基本上会将MongoDB数据库和集群最强大的密码存储在明文中。如果对其进行加密,则必须在某个时刻以安全的方式将解密密钥传递给应用程序。所有这些都是为了打破最佳实践(“关注点分离”)