Keycloak/OIDC : 检索用户组属性

Posted

技术标签:

【中文标题】Keycloak/OIDC : 检索用户组属性【英文标题】:Keycloak/OIDC : retrieve user groups attributes 【发布时间】:2019-10-15 03:53:33 【问题描述】:

我已经从 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 模板实现该结果? 谢谢

【问题讨论】:

我还在 Keycloak 的文档中读到了这一点:“组管理用户组。可以为组定义属性。您也可以将角色映射到组。成为 a 成员的用户组继承了组定义的属性和角色映射";是说我宁愿直接在用户信息中查找这些属性吗?但他们也没有出现,所以我的问题仍然存在...... 对不起,法国假期...我会试一试,尽快回复你 【参考方案1】:

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

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

现在此信息将开始进入您的访问令牌:

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

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

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

【讨论】:

很好,当询问管理员时,我确实可以将所有组属性检索到“其他声明”中(实际上混合到一个“组”条目中,但这对我的用例没有影响) API 用户信息(也就是说进入 UserInfo,而不是进入 AccessTokenResponse)。非常感谢! 我的坏@tryingtolearn ...我检索到的是组名,但我需要的是我的组的属性! 你应该使用组来获得权限吗?我们不应该使用角色吗?我不确定设置权限的最佳方法。我是 keycloak 的新手;希望这不是一个愚蠢的问题。【参考方案2】:

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

【讨论】:

它对你有用吗?无法使用映射器 AFAIK 映射组属性... 我花了一段时间才明白这个答案。您参考以下内容:成为组成员的用户继承组定义的属性。这意味着您实际上可以进行用户属性映射并期望从他们的组中获取属性。请小心,因为您可能会在用户属性组的名称之间遇到一些冲突

以上是关于Keycloak/OIDC : 检索用户组属性的主要内容,如果未能解决你的问题,请参考以下文章

从 Firebase Analytics 中检索用户属性

如何使用 Python 检索给定用户的所有推文和属性?

如何使用 Python 检索给定用户的所有推文和属性?

.net Web API。如何从访问令牌中检索用户属性(用户 ID)?基于当前用户/令牌的请求处理程序代码

SamlCredential 不从 Okta SAML 响应中检索组属性

无法在 gwt 中检索会话属性