Quarkus 中的多租户:从 SecurityIdentity 获取租户 ID,而不是请求路径

问题描述 投票:0回答:1

我正在 Quarkus 中试验 OIDC 多租户。 官方文档中的示例使用请求路径来推断租户 ID,然后据此选择 OIDC 配置。

我想要实现的是从当前用户令牌中的声明中获取租户 ID。 我创建了一个自定义的

TenantConfigResolver
。为了获得索赔值,我在解析器中注入了
SecurityIdentity
。这很好用。

但是当我想使用

((OidcJwtCallerPrincipal) securityIdentity.getPrincipal()).getClaim("...")
从中读取声明时,我得到了这个异常:
java.lang.IllegalStateException: The current thread cannot be blocked: vert.x-eventloop-thread-3

如果我在

TenantResolver
(而不是
TenantConfigResolver
)中尝试,也会发生同样的事情。

我想做的事情有意义吗?如果是,正确的做法是什么?

openid-connect quarkus multi-tenant
1个回答
0
投票

发生这种情况是因为安全身份尚未经过验证和准备。在这种情况下,您需要从原始令牌中获取声明,使用 Vert.x

RoutingContext
(
context.request().headers()
) 从 Authorization 标头中获取令牌,将其分割为
.
,Base64 URL 解码中间部分包含 JSON 格式声明的序列,例如,您可以尝试
io.quarkus.oidc.runtime.OidcUtils.decodeJwtContent(rawToken)
,它将返回 Vert.x
JsonObject
- 现在一切都已准备好检查声明并动态选择准备好的租户。 HTH

© www.soinside.com 2019 - 2024. All rights reserved.