Keycloak 将自定义属性检索到 KeycloakPrincipal

Keycloak retrieve custom attributes to KeycloakPrincipal

在我的休息服务中,我可以使用

验证后获取主体信息
KeycloakPrincipal kcPrincipal = (KeycloakPrincipal) servletRequest.getUserPrincipal();

声明。

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

是否可以在该代码中插入我的自定义委托人?

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

路在何方?

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

  1. 将属性添加到管理控制台
  2. 添加声明映射
  3. 访问声明

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

添加声明映射:

  1. 打开您领域的管理控制台。
  2. 转到客户端并打开您的客户端
  3. 这仅适用于“设置”>“访问类型机密”或public(非仅承载)
  4. 转到映射器
  5. 创建一个从您的属性到 json
  6. 的映射
  7. 勾选"Add to ID token"

访问声明:

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(...);
}

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

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

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

  • 获取自定义属性

更新

  • 在组级别添加 'phone' 属性,将用户分配到该组,您将从组级别获得所有用户的 'phone' 属性

  • 返回 mapper 并用 'Aggregate attribute values = true' 和 'Multivalued=true' 更新 'phone',你会得到 'phone' 作为列表,其中包含组和用户级别。如果保留 'Aggregate attribute values = false' 或 'Multivalued=false',您只会得到一个值,其中用户的 'phone' 属性将覆盖组的 'phone' 属性(这很有意义)