繁体   English   中英

Keycloak 将自定义属性检索到 KeycloakPrincipal

[英]Keycloak retrieve custom attributes to KeycloakPrincipal

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

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. 这仅适用于设置 > 访问类型机密或公开(非承载)
  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(...);
}

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

  • 选择用户 > 查找 > 单击 ID > 转到属性选项卡 > 添加属性 > 例如:电话 > 保存在此处输入图片说明

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

    在此处输入图片说明

    在此处输入图片说明

    在此处输入图片说明

  • 获取自定义属性

    在此处输入图片说明

    在此处输入图片说明

更新

  • 在组级别添加“电话”属性,将用户分配到该组,然后您从所有用户的组级别获得“电话”属性

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

对于 Keycloak > 18,映射器的配置已在 UI 中移动:

Clients > Your selected clientClient Scopes选项卡下选择的客户,必须 select account-dedicated

在此处输入图像描述

可以添加自定义映射器:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM