Keycloak 检索自定义属性到 KeycloakPrincipal

问题描述 投票:0回答:4

在我的休息服务中,我可以在身份验证后使用

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

声明。

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

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

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

有什么方法?

authentication jboss customization principal keycloak
4个回答
93
投票

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

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

我将其用于通过自定义主题添加的自定义属性。


73
投票
  • 选择用户 > 查找 > 单击 ID > 转到属性选项卡 > 添加属性 > 例如:电话 > 保存 enter image description here

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

    enter image description here

    enter image description here

    enter image description here

  • 获取自定义属性

    enter image description here

    enter image description here

更新

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

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


8
投票

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

Clients > Your selected client
选项卡
Client Scopes
下,必须选择
account-dedicated
:

enter image description here

可以添加自定义映射器:

enter image description here


0
投票

对于 KeyCloak v25,您还必须设置此权限:

有关官方文档的更多详细信息。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.