Keycloak 将自定义属性检索到 KeycloakPrincipal

Posted

技术标签:

【中文标题】Keycloak 将自定义属性检索到 KeycloakPrincipal【英文标题】:Keycloak retrieve custom attributes to KeycloakPrincipal 【发布时间】:2015-12-17 04:31:51 【问题描述】:

在我的休息服务中,我可以使用身份验证后获取主体信息

KeycloakPrincipal kcPrincipal = (KeycloakPrincipal) servletRequest.getUserPrincipal();

声明。

Keycloak 主体不包含我需要的有关经过身份验证的用户的所有信息。 是否可以自定义我自己的主体类型? 在 keycloak-server-end 我开发了一个用户联合提供者。我看到 UserModel 可以为我的用户添加一组自定义属性。

是否可以在该代码中插入我的自定义主体?

是否可以从 keycloak 主体中检索此属性?

什么方法?

【问题讨论】:

***.com/questions/29014894/… 【参考方案1】:

要添加自定义属性,您需要做三件事:

    向管理控制台添加属性 添加声明映射 访问声明

第一个在这里解释得很好:https://www.keycloak.org/docs/latest/server_admin/index.html#user-attributes

添加声明映射:

    打开您领域的管理控制台。 转到客户并打开您的客户 这仅适用于“设置”>“访问类型”机密或公开(不限于不记名) 转到映射器 创建从属性到 json 的映射 勾选“添加到 ID 令牌”

访问声明:

final Principal userPrincipal = httpRequest.getUserPrincipal();

if (userPrincipal instanceof KeycloakPrincipal) 

    KeycloakPrincipal<KeycloakSecurityContext> kp = (KeycloakPrincipal<KeycloakSecurityContext>) userPrincipal;
    IDToken token = kp.getKeycloakSecurityContext().getIdToken();

    Map<String, Object> otherClaims = token.getOtherClaims();

    if (otherClaims.containsKey("YOUR_CLAIM_KEY")) 
        yourClaim = String.valueOf(otherClaims.get("YOUR_CLAIM_KEY"));
    
 else 
    throw new RuntimeException(...);

希望这有助于并适合您的用例。我将此用于添加自定义主题的自定义属性。

【讨论】:

我可以检索电子邮件 ID、GivenName、Family Name。但无法检索自定义属性 mobile。我收到大小为 0 的 OtherClaims。 我的代码是:KeycloakAuthenticationToken token = (KeycloakAuthenticationToken) 请求。获取用户主体(); KeycloakPrincipal 主体 = (KeycloakPrincipal) token.getPrincipal(); IDToken idToken = principal.getKeycloakSecurityContext().getIdToken(); System.err.println("size "+otherClaims.size()+idToken.getEmail()+idToken.getFamilyName()); @SuryaMovva,您是否在您正在使用的客户端下的 keycloak 管理控制台中添加了映射? @TurbutAlin 嗨。我也有同样的问题。我看不到添加到用户的新属性。我已经在我的客户端(spring boot 应用程序)下添加了映射,但仍然没有收到新的属性。能否请你帮忙?谢谢 链接已过期,正确的是keycloak.org/docs/latest/server_admin/…【参考方案2】:

选择用户 > 查找 > 单击 ID > 转到属性选项卡 > 添加属性 > 例如:电话 > 保存

选择客户端 > 点击客户端 ID > 转到映射器选项卡 > 创建映射器

获取自定义属性

更新

在组级别添加“电话”属性,将用户分配到该组,您可以从组级别为所有用户获取“电话”属性

返回映射器并使用“聚合属性值 = true”和“多值 = true”更新“电话”,您将获得“电话”作为列表,其中包含组和用户级别的属性。如果您保留“Aggregate attribute values = false”或“Multivalued=false”,您只会得到一个值,其中来自用户的“phone”属性将覆盖来自组的“phone”属性(这是有道理的)

【讨论】:

谢谢@Neeraj 我正在做你刚刚发布的同样的事情。我这边的问题是缓存。添加映射或用户属性后,我需要在 Keycloak 管理控制台中清理领域缓存。之后我也能够看到 otherClaims 中的属性。希望这对每个人都有帮助。 @troger19 谢谢你的评论,我花了好几个小时,因为我没想到。 感谢您的解决方案。有没有办法将自定义属性应用于所有用户?我特别需要为通过我的 Ldap 提供程序导入的所有用户执行此操作。 感谢您的解决方案!做了我们想要的!使用组属性选项更新您的答案 我是 KeyCloak 的新手,正在使用最新的 6.0.1 版。你的回答真是神来之笔——清晰、简洁、正确!谢谢。赞!!

以上是关于Keycloak 将自定义属性检索到 KeycloakPrincipal的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak/OIDC : 检索用户组属性

Keycloak IdP SAML2 将 XML 元数据导出到 SP

Keycloak - 如何允许在没有注册的情况下链接帐户

使用接收到的访问令牌检索 Keycloak 用户数据

Keycloak集成三方身份提供者的注销流程

“无法连接到数据库”:Keycloak Operator 外部数据库配置不起作用