有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (2) 个答案

  1. # 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. # 2 楼答案

    在Java代码中这样做并不是最好的方法,除了非常罕见的用例(为MongoDB编写管理应用程序)之外,甚至还有一个我强烈反对的用例

    安全风险

    首先,您的应用程序需要极高的权限,即管理数据库上的^{}^{},这或多或少授予相同的权限:随意创建超级用户。换言之:此代码将具有很高的安全风险

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

    技术问题

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