当前位置: 首页 > 知识库问答 >
问题:

维特。x JDBCAuth不在RoutingContext中存储用户对象

魏风华
2023-03-14

我用vert设置了JDBCAuth。x、 身份验证工作正常。我在jdbauth之后得到用户对象。身份验证(adminLoginHandler),但在下一个HTTP GET查询(adminReadHandler)的RoutingContext中为空。

我检查了,RoutingContext有会话和cookie对象。

我添加BodyHandler、CookieHandler、SessionHandler。create(LocalSessionStore.create(vertx)),UserSessionHandler。在设置路由之前创建(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个答案

宗政功
2023-03-14

事实证明,问题不在后端(vertx)端。我在前端代码中使用了浏览器获取api,但忘记了包含凭证:“包含”选项。

弗朗西斯科:谢谢你的努力。你的要点帮助我一点一点地追溯这个问题。

附注:虽然我的authn/authz现在正在工作,但我仍然没有在chrome调试器的网络/cookie面板上看到cookie,使用的是抓取api。如果我直接将网址写入浏览器,我可以看到一切。

 类似资料:
  • 我在接收json数组时遇到问题 发送JSON是: 错误是: 租户安全等级: 执行routingContext时出错。下一个()。。。我怎样才能解决这个问题? 注意:TenantsSwitcherHandler类注册为安全处理程序,它根据X-TENANT-ID头值切换指向数据库的指针

  • 问题内容: 我在开发中使用带有护照的节点/表达式。我碰到一篇文章说: Express加载会话数据并将其附加到请求。当护照在会话中存储序列化的用户时,可以在req.session.passport.user中找到序列化的用户对象。 但是令我惊讶的是,浏览器cookie中的sessionID存储的值在登录前后都保持不变。那么,序列化的用户对象存储在哪里? 我以为它最初存储在用户cookie中,但似乎不

  • sql.conf中的read_groups指令的值可能由前一个管理员设置为no;将其更改为yes将激活所有用户的组表读取。 需要先安装freeradius-postgresql包。该软件包包含所需的设置文件以及PostgreSQL特定的FreeRADIUS模块。 不,您不对SQL数据库或文本文件进行身份验证,而是使用它们来存储凭据。然后,验证模块使用存储在文本文件或SQL数据库中的数据进行密码验证

  • 用户存储 用户存储是保存用户详细信息的地方。理想的情况是有一个单一的用户存储,使用不同的系统来使用这个单一的源。企业对这样一个存储的需求导致了目录的产生。Novell的edirectory、Microsoft的Active Directory和OpenLDAP都是目录的例子。 在WWW领域,谷歌和Facebook等流行的网络环境允许第三方通过网络服务使用他们的用户存储。 这使外部Web应用程序可以

  • 我已经在互联网上搜索了问题的答案,但似乎无法得到我正在寻找的答案,我有两个类,application类和users类,我提示用户输入一个新用户或返回数组列表中已经设置为保存users对象的用户的结果。在应用程序结束后,我希望数组列表继续容纳对象,以便在应用程序类中每次连续运行main方法时,我都可以引用arrayList进行交叉检查。 下面是我正在学习的两门课。首先是应用程序类,其次是用户。 我对