Keycloak/OIDC : 检索用户组属性

Keycloak/OIDC : retrieve user groups attributes

我已经从 Keycloak 的 OIDC 端点中提取了用户的组信息,但它们不包含我定义的组属性(请参阅组表单中的“属性”选项卡,靠近“设置”)。是否有索赔要添加到我的请求中?

我正在使用 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());
    }
}

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

我了解到可以将声明添加到用户信息请求中。它对管理员 API 有效吗?如何使用 RESTeasy 模板实现该结果? 谢谢

我可以通过在令牌中添加 groups/roles 信息来实现这一点 other claims 属性:

为此,在 keycloak 配置中,转到您的客户端 -> 映射器并添加一个 group/role 映射器。例如。

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

要访问 Java 中的这些组属性,您可以从访问令牌的 otherclaims 属性 中提取它。例如:

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

在下图中,您可以看到令牌的 otherclaims 属性 填充了我们在 keycloak 上创建的组属性。请注意,如果我们将 "token claim property" 命名为 groupXYZ,则 otherclaims 将显示: groupsXYZ=[Administrator]

这就是我最终可以将组属性(作为用户属性继承,如前所述)映射到用户信息,映射到 "other claims" 部分的方式: