Authentication KeyClope检索KeyClope主体的自定义属性

Authentication KeyClope检索KeyClope主体的自定义属性,authentication,jboss,customization,principal,keycloak,Authentication,Jboss,Customization,Principal,Keycloak,在我的rest服务中,我可以使用 KeycloakPrincipal kcPrincipal = (KeycloakPrincipal) servletRequest.getUserPrincipal(); 声明 Keyclope principal不包含我需要的关于经过身份验证的用户的所有信息。 是否可以自定义我自己的主体类型? 在KeyClope服务器端,我开发了一个用户联合提供者。我看到UserModel可以向我的用户添加一组自定义属性 可以在代码中插入我的自定义主体吗 是否可以从Key

在我的rest服务中,我可以使用

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

Keyclope principal不包含我需要的关于经过身份验证的用户的所有信息。 是否可以自定义我自己的主体类型? 在KeyClope服务器端,我开发了一个用户联合提供者。我看到UserModel可以向我的用户添加一组自定义属性

可以在代码中插入我的自定义主体吗

是否可以从KeyClope主体检索此属性


方法是什么?

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

  • 向管理控制台添加属性
  • 添加索赔映射
  • 访问权声明
  • 第一个在这里解释得很好:

    添加索赔映射:

    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(...);
    }
    
  • 打开您所在领域的管理控制台
  • 转到客户并打开您的客户
  • 这仅适用于设置>访问类型机密或公共(不限于持有人)
  • 去地图绘制者那里
  • 创建从属性到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(...);
    }
    
    final-Principal-userPrincipal=httpRequest.getUserPrincipal();
    if(userPrincipal instanceof keydropecipal){
    keydepaprincipal kp=(keydeprincipal)userPrincipal;
    IDToken token=kp.getKeyDopperSecurityContext().getIdToken();
    Map otherClaims=token.getOtherClaims();
    如果(otherClaims.containsKey(“您的索赔密钥”)){
    yourClaim=String.valueOf(otherClaims.get(“YOUR_CLAIM_KEY”);
    }
    }否则{
    抛出新的RuntimeException(…);
    }
    
    希望这有助于并适合您的用例。我将其用于添加自定义主题的自定义属性。

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

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

    • 获取自定义属性

    更新

    • 在组级别上添加“phone”属性,将用户分配到该组,然后从组级别为所有用户获取“phone”属性

    • 返回mapper并使用“聚合属性值=true”和“多值=true”更新“phone”,您将获得“phone”作为列表,其中包含来自组和用户级别的属性。如果保留“聚合属性值=false”或“多值=false”,则只会得到一个值,其中来自用户的“phone”属性将覆盖来自组的“phone”属性(这很有意义)


    我可以检索电子邮件id、GivenName、姓氏。但无法检索自定义属性mobile。我正在获取大小为0的其他声明。我的代码是:keyDoppeAuthenticationToken=(keyDoppeAuthenticationToken)请求。getUserPrincipal();keydoveprincipal=(keydoveprincipal)令牌.getPrincipal();IDToken IDToken=principal.GetKeyDopperSecurityContext().getIdToken();System.err.println(“size”+otherClaims.size()+idToken.getEmail()+idToken.getFamilyName())@SuryaMovva,您是否已将映射添加到您正在使用的客户端下的Keyclope管理控制台中?@TurbutAlin Hi。我也有同样的问题。我看不到添加到用户的新属性。我已经在我的客户端(SpringBoot应用程序)下添加了映射,但仍然没有收到新属性。你能帮忙吗?ThanksLink已经过时了,正确的一个是Thanks@Neeraj我正在做你刚刚发布的同样的事情。我这边的问题是缓存。添加映射或用户属性后,我需要在KeyClope管理控制台中清理领域缓存。之后,我也能够看到其他声明中的属性。希望这对每个人都有帮助。@troger19谢谢你的评论,我花了好几个小时,因为我没有想到这一点。谢谢你的解决方案。是否有方法将自定义属性应用于所有用户?我特别需要为通过Ldap提供商导入的所有用户执行此操作。感谢您的解决方案!做了我们想做的!使用组属性选项更新您的答案我是Key斗篷新手,正在使用最新版本6.0.1。你的回答真是天赐良机——清晰、简洁、正确!谢谢荣誉