Keycloak将自定义属性检索到KeycloakPrincipal

Ale*_*lex 31 authentication customization jboss principal keycloak

在我的休息服务中,我可以在认证后使用获取主要信息

KeycloakPrincipal kcPrincipal = (KeycloakPrincipal) servletRequest.getUserPrincipal();
Run Code Online (Sandbox Code Playgroud)

声明.

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

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

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

这是什么方式?

lis*_* p. 62

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

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

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

添加声明映射:

  1. 打开领域的管理控制台.
  2. 转到客户端并打开您的客户端
  3. 这仅适用于设置>访问类型机密或公共(不仅限承载)
  4. 转到Mappers
  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(...);
}
Run Code Online (Sandbox Code Playgroud)

希望这有助于并适合您的用例.我用它来添加自定义主题的自定义属性.


Nee*_*wal 33

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

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

    在此输入图像描述

    在此输入图像描述

    在此输入图像描述

  • 获取自定义属性

    在此输入图像描述

    在此输入图像描述

  • 谢谢@Neeraj我刚才在做同样的事情。我这边的问题是缓存。添加映射或用户属性后,我需要在Keycloak管理控制台中清理领域缓存。之后,我也能够在otherClaims中看到属性。希望这对您有所帮助。 (2认同)
  • 谢谢您的解决方案。有没有一种方法可以将自定义属性应用于所有用户?我特别需要对通过Ldap提供程序导入的所有用户执行此操作。 (2认同)

Ste*_*fan 8

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

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

在此输入图像描述

可以添加自定义映射器:

在此输入图像描述