在我的休息服务中,我可以在身份验证后使用
获取主体信息KeycloakPrincipal kcPrincipal = (KeycloakPrincipal) servletRequest.getUserPrincipal();
声明。
Keycloak 主体不包含我需要的有关经过身份验证的用户的所有信息。 是否可以自定义我自己的主体类型? 在 keycloak 服务器端,我开发了一个用户联合提供程序。我看到 UserModel 可以为我的用户添加一组自定义属性。
是否可以在该代码中插入我的自定义主体?
是否可以从 keycloak 主体检索此属性?
有什么方法?
要添加自定义属性,您需要做三件事:
第一个在这里解释得很好:https://www.keycloak.org/docs/latest/server_admin/index.html#user-attributes
添加声明映射:
访问声明:
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 > 转到映射器选项卡 > 创建映射器
获取自定义属性
更新
在组级别添加“电话”属性,将用户分配到该组,然后您可以从组级别为所有用户获取“电话”属性
返回映射器并使用“聚合属性值= true”和“多值= true”更新“电话”,您将获得“电话”列表,其中包含组和用户级别的属性。如果保留“聚合属性值= false”或“多值= false”,则只会得到一个值,其中用户的“电话”属性将覆盖组中的“电话”属性(这是有道理的)