0

我正在研究 Vertx MongoClient API。我之前从 Docker 安装了 Restheart 和它自己的 mongodb 副本,所以现在我在 docker-compose.yml 中有 Restheart 的默认配置和 Mongo 的默认配置:

        MONGO_INITDB_ROOT_USERNAME: restheart
        MONGO_INITDB_ROOT_PASSWORD: R3ste4rt!

我将 Vertx Mongoclient 放入 Verticle:

公共类 MongoClientVerticle 扩展 AbstractVerticle {

    MongoClient mongoClient;
    String db = "monica";
    String collection = "sessions";
    String uri = "mongodb://localhost:27017";
    String username = "admin";
    String password = "password";
    MongoAuth authProvider;

    @Override
    public void start() throws Exception {

        JsonObject config = Vertx.currentContext().config();


        JsonObject mongoconfig = new JsonObject()
                .put("connection_string", uri)
                .put("db_name", db);

        mongoClient = MongoClient.createShared(vertx, mongoconfig);
        JsonObject authProperties = new JsonObject();
        authProvider = MongoAuth.create(mongoClient, authProperties);
//        authProvider.setHashAlgorithm(HashAlgorithm.SHA512);
        JsonObject authInfo = new JsonObject()
                .put("username", username)
                .put("password", password);
        authProvider.authenticate(authInfo, res -> {
            if (res.succeeded()) {
                User user = res.result();
                System.out.println("User " + user.principal() + " is now authenticated");
            } else {
                res.cause().printStackTrace();
            }
        });
    }

我建立了一个简单的查询:

public void find(int limit) {
    JsonObject query = new JsonObject();
    FindOptions options = new FindOptions();
    options.setLimit(1000);
    mongoClient.findWithOptions(collection, query, options, res -> {
        if (res.succeeded()) {
            List<JsonObject> result = res.result();
            result.forEach(System.out::println);
        } else {
            res.cause().printStackTrace();
        }
    });
}

但是当我访问数据库时,我得到了这个错误:

MongoQueryException:查询失败,错误代码 13 和错误消息“没有经过身份验证的用户”在服务器 localhost:27017

我在身份验证过程中缺少什么?

我正在使用最新的 restheart + mongodb 和 vertx 3.5.3

4

1 回答 1

0

需要明确的是,RESTHeart 不附带它自己的 Mongodb 副本,而是连接到任何现有的 Mongodb 实例。您可以通过 docker compose 启动的实例仅用于演示目的。

这个问题与 Vertx + Mongodb 有很大关系。我不是这方面的专家,但显然 Vert.x Auth Mongo 不使用数据库帐户来验证用户,它使用特定的集合(默认情况下是“用户”集合)。您可以仔细检查Vertx 文档以防万一。

但是请注意,RESTHeart 的主要目的是提供对 Mongodb 的直接 HTTP 访问,而不需要编写任何特定的客户端或驱动程序。所以附带的一点是,如果您使用的是 Vertx,那么您可能不需要 RESTHeart,反之亦然。否则,您可以简单地通过 Vertx 的 HTTP 客户端连接到 RESTHeart,完全跳过 MongoClient API。

于 2018-08-31T07:47:02.287 回答