Quarkus如何配置使用Client Roles替代Realm Roles(无对应配置项)
在Quarkus中使用Keycloak客户端角色(Client Roles)实现权限控制
问题背景
在Spring Boot应用中,通过配置Keycloak的use-resource-role-mappings: true,可实现基于客户端角色(而非领域角色)的权限控制:指定客户端为test-client,给该客户端分配test-role1角色后,用@RolesAllowed("test-role1")注解就能控制接口访问,运行正常。
但在Quarkus应用中,找不到对应的use-resource-role-mappings配置项,目前只有当创建领域角色test-role1并分配给用户时,接口权限控制才生效。而实际需求必须使用客户端角色,且JWT令牌中已包含test-client的test-role1客户端角色(令牌片段如下)。
相关配置与代码
Spring Boot配置
keycloak: realm: myrealm resource: test-client auth-server-url: http://localhost:8080 use-resource-role-mappings: true # 控制从领域还是客户端层面映射角色 bearer-only: true
Spring Boot接口代码
@Path("/my-path") @RolesAllowed("test-role1") public String testPath() { return "success"; }
Quarkus当前配置
quarkus.oidc.client-id=test-client quarkus.oidc.auth-server-url=http://localhost:8080/realms/myrealm quarkus.oidc.credentials.secret=test-client-secret # 缺少对应use-resource-role-mappings的配置
JWT令牌片段
"realm_access": { "roles": [ "offline_access", "uma_authorization", "default-roles-myrealm" ] }, "resource_access": { "test-client": { "roles": [ "test-role1" ] }, "account": { "roles": [ "manage-account", "manage-account-links", "view-profile" ] } }
解决方案
在Quarkus中,通过配置角色来源为resource_access,即可实现读取客户端角色用于权限控制,具体配置如下:
quarkus.oidc.client-id=test-client quarkus.oidc.auth-server-url=http://localhost:8080/realms/myrealm quarkus.oidc.credentials.secret=test-client-secret # 指定从resource_access中读取角色(对应Spring Boot的use-resource-role-mappings: true) quarkus.oidc.roles.source=resource_access
说明
- 当
quarkus.oidc.roles.source设置为resource_access时,Quarkus会自动从JWT的resource_access字段中,匹配当前配置的quarkus.oidc.client-id对应的角色列表(即resource_access.test-client.roles)。 - 接口代码无需修改,依然使用
@RolesAllowed("test-role1")注解即可实现基于客户端角色的权限控制。
内容的提问来源于stack exchange,提问作者moyajih568
相关产品推荐
相关产品推荐

