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的主要内容,如果未能解决你的问题,请参考以下文章