将用户区域设置包含到 Keycloak ID 令牌中

Include user locale to the Keycloak ID token

我希望 Keycloak (1.4.0) 将用户选择的语言环境包含到 ID 令牌中。

我已经创建了一个用户属性映射器,它应该将语言环境属性映射到令牌,但它不起作用。

有人知道怎么做吗?

提前致谢。

编辑:我从这个 class 中学到了我对 Keycloak Locales 的了解:http://grepcode.com/file/repository.jboss.org/nexus/content/repositories/releases/org.keycloak/keycloak-forms-common-freemarker/1.2.0.Final/org/keycloak/freemarker/LocaleHelper.java#LocaleHelper.0LOGGER

我想你已经有了这样的东西:

  1. 打开您领域的管理控制台。
  2. 去客户和select你的客户
  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(...);
}

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

我已经设法自己解决了这个问题。我最终使用了 Keycloak JS 适配器中的 loadUserProfile() 函数。它将所有用户属性(包括语言环境)加载到 keycloak.profile 对象中,因此我不必配置任何映射器。