我使用
quarkus:quarkus-oidc
和 io.quarkus:quarkus-keycloak-authorization
以及 @RolesAllowed({"APP_ADMIN", ...})
注释来保护我的端点。
默认情况下,Quarkus OIDC 从提供的 JWT 令牌中的
groups
声明中读取角色,但我的组织为此目的使用名为 roles
的自定义声明。
角色是根据组声明(例如“JUST:SOME_GROUPS”)设置的,但我需要 Quarkus 来使用角色声明。我无法修改组织中的 JWT 结构,因此我需要配置 Quarkus 来查看角色声明。
我在文档中找到了 quarkus.oidc.roles.role-claim-path 属性,并尝试将其设置为
roles
和 "roles"
,但是都不起作用 — 我已经注入了 SecurityIdentity
来验证这样,角色就变成空的了。
如何配置 Quarkus OIDC 从 JWT 中的角色声明中读取角色,而不是从默认组声明中读取角色?是否需要任何额外的配置或自定义逻辑来实现此目的?
好吧,这主要是我测试问题的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"