Keycloak / OIDC:检索用户组属性

时间:2019-05-29 13:50:56

标签: resteasy oidc keycloak-services

我已经从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结构中没有提供任何属性。

我已阅读到可以将声明添加到用户信息请求中。可以在admin API上使用吗?如何使用RESTeasy模板实现该结果? 谢谢

2 个答案:

答案 0 :(得分:0)

我可以通过在令牌的其他声明属性中添加组/角色信息来实现这一目标:

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

enter image description here

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

enter image description here

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

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

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

enter image description here

答案 1 :(得分:0)

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

User Attribute Mapper