如何配置 Quarkus OIDC 以从自定义 JWT 声明而不是默认的“组”声明中读取角色?

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

我使用

quarkus:quarkus-oidc
io.quarkus:quarkus-keycloak-authorization
以及
@RolesAllowed({"APP_ADMIN", ...})
注释来保护我的端点。

默认情况下,Quarkus OIDC 从提供的 JWT 令牌中的

groups
声明中读取角色,但我的组织为此目的使用名为
roles
的自定义声明。

问题:

角色是根据组声明(例如“JUST:SOME_GROUPS”)设置的,但我需要 Quarkus 来使用角色声明。我无法修改组织中的 JWT 结构,因此我需要配置 Quarkus 来查看角色声明。

enter image description here

我尝试过的:

我在文档中找到了 quarkus.oidc.roles.role-claim-path 属性,并尝试将其设置为

roles
"roles"
,但是都不起作用 — 我已经注入了
SecurityIdentity
来验证这样,角色就变成空的了。

问题:

如何配置 Quarkus OIDC 从 JWT 中的角色声明中读取角色,而不是从默认组声明中读取角色?是否需要任何额外的配置或自定义逻辑来实现此目的?

openid-connect quarkus claims-based-identity quarkus-oidc
1个回答
0
投票

好吧,这主要是我测试问题的HOW问题,部分原因是 yaml 语法。 我已将

SecurityIdentity
类注入到一个新的调试端点中,其中 我没有用 @RolesAllowed(...)
 注释
,因为我想检查安全行为以及设置的角色。我这样做是因为在使用其他端点进行测试时,调试器没有在我的端点处理代码中激活。 但是,如果端点未注释为受保护,例如
@RolesAllowed(...)
,则不会设置声明和角色。因此,我将调试点转移到处理声明设置的内部类(如
io.quarkus.oidc.runtime.OidcUtils
),瞧;我可以追踪问题。

配置属性

quarkus.oidc.roles.role-claim-path
是正确的属性,必须设置为自定义 jwt 声明对象(在我的例子中为“角色”)。该属性采用一个元素列表,如果没有找到,它会查找 jwt 令牌的“groups”属性。 通过查看
io.quarkus.oidc.runtime.OidcUtils
类和相应的配置类
io.quarkus.oidc.OidcTenantConfig
可以跟踪此行为。

在 yaml 语法中,自定义声明对象可以这样设置:

quarkus:
  oidc:
    roles:
      role-claim-path:
        - "roles"
© www.soinside.com 2019 - 2024. All rights reserved.