46

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

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

陈述。

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

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

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

方法是什么?

4

2 回答 2

87

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

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

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

添加声明映射:

  1. 打开您领域的管理控制台。
  2. 转到客户并打开您的客户
  3. 这仅适用于“设置”>“访问类型”机密或公开(不限于不记名)
  4. 转到映射器
  5. 创建从您的属性到 json 的映射
  6. 选中“添加到 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(...);
}

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

于 2015-10-01T14:22:51.427 回答
63
  • 选择用户>查找>单击ID>转到属性选项卡>添加属性>例如:电话>保存 在此处输入图像描述

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

    在此处输入图像描述

    在此处输入图像描述

    在此处输入图像描述

  • 获取自定义属性

    在此处输入图像描述

    在此处输入图像描述

更新

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

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

于 2017-12-06T18:55:32.587 回答