vert.x JDBCAuth не хранит объект пользователя в RoutingContext - PullRequest
0 голосов
/ 29 марта 2019

Я установил JDBCAuth с vert.x, и аутентификация работает.Я получаю объект User после JDBCAuth.authenticate (adminLoginHandler), но он является нулевым в RoutingContext при следующем HTTP-запросе GET (adminReadHandler).

Я проверил, RoutingContext там содержит сеанс и объект cookie.

Я добавляю BodyHandler, CookieHandler, SessionHandler.create (LocalSessionStore.create (vertx)), UserSessionHandler.create (adminAuth) перед тем, как задавать маршруты.

Я использую OpenAPI3RouterFactory для установки маршрутизации.

Думаю, я все сделал как в документации, так и в примере кода.Чего мне не хватает?

suspend fun createJDBCAuth(vertx : Vertx, name : String) : JDBCAuth
{
    val con = getConnection(vertx, name)
    return JDBCAuth.create(vertx, con)
        .setAuthenticationQuery("SELECT PASSWORD, PASSWORD_SALT FROM \"user\" WHERE USERNAME = ?")
        .setHashStrategy(JDBCHashStrategy.createPBKDF2(vertx))
        .setNonces(json {
            array(45, 385)
        })
}
adminAuth = createJDBCAuth(vertx, "adminreader")
OpenAPI3RouterFactory.create(vertx, "openapi.yaml")
{ ar ->
    if (ar.succeeded())
    {
        // Spec loaded with success
        var factory = ar.result()

        logger.info("Factory succeed")

        factory.setBodyHandler(BodyHandler.create().setBodyLimit(1024 * 1024))
            .addGlobalHandler(CookieHandler.create())
            .addGlobalHandler(SessionHandler.create(LocalSessionStore.create(vertx)))
            .addGlobalHandler(UserSessionHandler.create(adminAuth))
            .addGlobalHandler(CorsHandler.create("https://localhost:3000")
                .allowCredentials(true)
                .allowedHeader("Content-Type")
                .allowedMethod(HttpMethod.GET)
                .allowedMethod(HttpMethod.POST)
                .allowedMethod(HttpMethod.OPTIONS)
            )
inputMap.forEach { path ->
    when {
        path.key == "/admin/login" -> factory.addHandlerByOperationId(path.value.operationId, adminLoginHandler)
        path.key.startsWith("/admin/") -> factory.addHandlerByOperationId(path.value.operationId, adminReadHandler)
    }
}

Обновлена ​​функция.

    private val adminLoginHandler = Handler<RoutingContext>
    { rc ->
        adminAuth.authenticate(rc.bodyAsJson)
        { res ->
            launch {

                var retJson = json { obj() }

                if (res.succeeded()) {

                    var user = res.result()
                    rc.session()?.regenerateId()
                    rc.setUser(user)

                    retJson = retJson.put("succeed", true)

                    if (user.isAuthorizedAwait("createadmin"))
                        retJson = retJson.put("createadmin", true)
                } else {
                    retJson = retJson
                        .put("succeed", false)
                        .put("message", res.cause().message)
                }

                rc.response()
                    .putHeader("content-type", "application/json")
                    .end(retJson.encode())
            }
        }
    }
private val adminReadHandler = Handler<RoutingContext>
{ rc ->

    if (rc.user() == null)
        rc.response().setStatusCode(403).end()
    else
    {
        val user = rc.user()
        val principal = user.principal()
    }
}

1 Ответ

1 голос
/ 30 марта 2019

Оказалось, что проблема не в серверной (vertx) стороне.Я использую браузер, извлекающий api в коде внешнего интерфейса, и я забыл включить учетные данные: опция «include».

Франческо: Спасибо за ваши усилия.Ваша суть помогла мне отследить проблему по частям.

Ps: хотя мой authn / authz работает сейчас, я все еще не вижу куки на панели сети / куки хром-отладчика, используяполучить api.Если я напишу URL прямо в браузер, я все увижу.

...