Как исправить «Внутреннюю ошибку сервера» при использовании EventBus в пользовательском AuthProvider - PullRequest
0 голосов
/ 05 июня 2019

Использование vert.x EventBus в пользовательском AuthProvider действительно выдает «Внутреннюю ошибку сервера» при будущем завершении.

Встроенный пользовательский AuthProvider, который получает пользовательские данные из EventBus.EventBus и пользовательские данные возвращаются правильно, но после successededFuture () в обработчике я получаю только «Internal Server Error».Не испортить ли обработчик и асинхронный режим EventBus.send ()?

package tld.domain.auth;

import io.vertx.core.AsyncResult;
import io.vertx.core.Future;
import io.vertx.core.Handler;
import io.vertx.core.Vertx;
import io.vertx.core.eventbus.EventBus;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.auth.AuthProvider;
import io.vertx.ext.auth.User;

public class MyAuthProvider implements AuthProvider {

    private final EventBus eventBus;

    public MyAuthProvider(Vertx vertx) {
        this.eventBus = vertx.eventBus();
    }

    public static MyAuthProvider create(Vertx vertx) {
        return new MyAuthProvider(vertx);
    }

    @Override
    public void authenticate(JsonObject jsonObject, Handler<AsyncResult<User>> handler) {

        try {
            eventBus.send("hello", null, message -> {
                try {
                    if (true) {
                        handler.handle(Future.succeededFuture(new MyAuthUser()));
                    } else {
                        handler.handle(Future.failedFuture("failed by purpose"));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

package tld.domain.auth;

import io.vertx.core.AsyncResult;
import io.vertx.core.Future;
import io.vertx.core.Handler;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.auth.AbstractUser;
import io.vertx.ext.auth.AuthProvider;

public class MyAuthUser extends AbstractUser {
    @Override
    protected void doIsPermitted(String s, Handler<AsyncResult<Boolean>> handler) {
        handler.handle(Future.succeededFuture(true));
    }

    @Override
    public JsonObject principal() {
        return null;
    }

    @Override
    public void setAuthProvider(AuthProvider authProvider) {

    }
}

А в вертикуле

_router = Router.router(vertx);

MyAuthProvider authProvider = MyAuthProvider.create(vertx);

// router auth session storage
_router.route().handler(CookieHandler.create());
_router.route().handler(SessionHandler.create(LocalSessionStore.create(vertx)).setAuthProvider(authProvider));

// router basic auth
AuthHandler basicAuthHandler = BasicAuthHandler.create(authProvider);
_router.route().handler(basicAuthHandler);

_router.route().handler(BodyHandler.create());
_router.get("/hello").handler(this::getHelloHandler);

Удаление eventbus.send () делаетпример работы (получение правильного ответа).При добавлении событийной шины результат теряется, и вместо ответа получается только «Внутренняя ошибка сервера».

Есть ли проблема с обработчиком и асинхронной функцией eventbus.send (), или я пропустил какую-то другую важную концепцию vert.x?

1 Ответ

0 голосов
/ 05 июня 2019

Я нашел решение, поменяв местами BodyHandler и порядок регистрации AuthHandler.

// BodyHandler FIRST !!!
_router.route().handler(BodyHandler.create());
// AuthHandler SECOND
_router.route().handler(_basicAuthHandler);
// DO NOT CREATE BodyHandler AFTER AuthHandler
//_router.route().handler(BodyHandler.create());
...