提问者:小点点

KeyCloak/OIDC:检索用户组属性


我已从KeyCloak的OIDCendpoint提取了用户的组信息,但它们不附带我定义的组属性(请参阅组表单中设置附近的属性选项卡)。是否有要添加到我的请求中的声明?

我正在使用RESTEasy客户端访问KeyCloak的管理API(比使用提供的管理客户端效果好得多):

@Path("/admin/realms/{realm}")
public interface KeycloakAdminService {
    @GET
    @Path("/users/{id}/groups")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    List<GroupRepresentation> getUserGroups(@PathParam("realm") String realm, @PathParam("id") String userId,
                                            @HeaderParam(AUTHORIZATION) String accessToken);
    //DEBUG the access token must always be prefixed by "Bearer "
}

所以我可以获取用户的组:

private void fetchUserGroups(UserInfoOIDC infos, String userId) {
    log.info("Fetching user groups from {}...", getRealm());
    try {
        KeycloakAdminService proxy = kcTarget.proxy(KeycloakAdminService.class);
        AccessTokenResponse response = authzClient.obtainAccessToken(getAdminUsername(), getAdminPassword());
        List<GroupRepresentation> groups = proxy.getUserGroups(getRealm(), userId,
                "Bearer " + response.getToken());
        infos.importUserGroups(groups); //DEBUG here we go!
    } catch (WebApplicationException e) {
        log.error("User groups failure on {}: {}", getRealm(), e.getMessage());
    }
}

但是当涉及到数据探索时,事实证明GroupPresation#getAt的结构中没有提供任何属性。

我读过可以将声明添加到用户信息请求中的文章。它在管理API上有效吗?如何使用RESTEasy模板实现该结果?谢谢


共3个答案

匿名用户

我能够通过在令牌其他索赔属性中添加组/角色信息来实现这一点:

对于keyCloak配置中的此内容,请转到您的客户端-

现在此信息将开始出现在您的访问令牌中:

要在Java中访问这些组属性,您可以将其提取自其他声明属性。例如:

KeycloakSecurityContext keycloakSecurityContext = (KeycloakSecurityContext)(request.getAttribute(KeycloakSecurityContext.class.getName()));         
AccesToken token = keycloakSecurityContext.getToken();

在下图中,您可以看到令牌的其他声明属性填充了我们在keyCloak上创建的组属性。请注意,如果我们将“令牌声明属性”命名为groupXYZ,则其他声明将显示:groupsXYZ=[管理员]

匿名用户

这就是我最终将组属性(继承为用户属性,如前所述)映射到用户信息中的“其他声明”部分的方式:

匿名用户

在创建新的用户属性映射器期间,可以通过打开聚合属性值选项从组继承属性。