Как я могу аутентифицировать Vertx MongoClient в докере с Mongodb и Restheart? Код ошибки 13 - PullRequest
0 голосов
/ 30 августа 2018

Я изучаю Vertx MongoClient API. Ранее я установил Restheart из Docker и его собственную копию mongodb, поэтому теперь у меня есть конфигурация по умолчанию для Restheart и конфигурация Mongo по умолчанию в docker-compose.yml:

        MONGO_INITDB_ROOT_USERNAME: restheart
        MONGO_INITDB_ROOT_PASSWORD: R3ste4rt!

Я положил Vertx Mongoclient в Вертикалю:

открытый класс 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 и сообщением об ошибке «Нет аутентифицированных пользователей» на локальном сервере: 27017

Что мне не хватает в процессе аутентификации?

Я использую последний рестарт + mongodb и vertx 3.5.3

1 Ответ

0 голосов
/ 31 августа 2018

Для ясности, RESTHeart не поставляется с собственной копией Mongodb, а подключается к любому существующему экземпляру Mongodb. Экземпляр, который вы можете запустить с помощью docker compose, предназначен только для демонстрационных целей.

Этот вопрос очень связан с Vertx + Mongodb. Я не эксперт в этом, но, очевидно, Vert.x Auth Mongo не использует учетные записи базы данных для аутентификации пользователей, он использует определенную коллекцию (по умолчанию коллекция "user"). Вы можете дважды проверить Vertx docs , чтобы быть уверенным в этом.

Однако учтите, что основная цель RESTHeart - предоставить прямой HTTP-доступ к Mongodb без необходимости программирования какого-либо конкретного клиента или драйвера. Таким образом, побочным моментом является то, что если вы используете Vertx, то, вероятно, вам не нужен RESTHeart, и наоборот. В противном случае вы можете просто подключиться к RESTHeart через HTTP-клиент Vertx, полностью пропустив MongoClient API.

...