Keycloak 将自定义属性检索到 KeycloakPrincipal
Keycloak retrieve custom attributes to KeycloakPrincipal
在我的休息服务中,我可以使用
验证后获取主体信息
KeycloakPrincipal kcPrincipal = (KeycloakPrincipal) servletRequest.getUserPrincipal();
声明。
Keycloak 主体不包含我需要的有关已验证用户的所有信息。
是否可以自定义我自己的主体类型?
在 keycloak-server-end 上,我开发了一个用户联合提供程序。我看到 UserModel 可以为我的用户添加一组自定义属性。
是否可以在该代码中插入我的自定义委托人?
是否可以从 keycloak 主体检索此属性?
路在何方?
要添加自定义属性,您需要做三件事:
- 将属性添加到管理控制台
- 添加声明映射
- 访问声明
第一个在这里解释得很好:https://www.keycloak.org/docs/latest/server_admin/index.html#user-attributes
添加声明映射:
- 打开您领域的管理控制台。
- 转到客户端并打开您的客户端
- 这仅适用于“设置”>“访问类型机密”或public(非仅承载)
- 转到映射器
- 创建一个从您的属性到 json
的映射
- 勾选"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(...);
}
希望这对您有所帮助并适合您的用例。我将其用于添加自定义主题的自定义属性。
Select 用户 > 查找 > 单击 ID > 转到属性选项卡 > 添加属性 > 例如:phone > 保存
Select 客户端 > 单击客户端 ID > 转到映射器选项卡 > 创建映射器
获取自定义属性
更新
在组级别添加 'phone' 属性,将用户分配到该组,您将从组级别获得所有用户的 'phone' 属性
返回 mapper 并用 'Aggregate attribute values = true' 和 'Multivalued=true' 更新 'phone',你会得到 'phone' 作为列表,其中包含组和用户级别。如果保留 'Aggregate attribute values = false' 或 'Multivalued=false',您只会得到一个值,其中用户的 'phone' 属性将覆盖组的 'phone' 属性(这很有意义)
在我的休息服务中,我可以使用
验证后获取主体信息KeycloakPrincipal kcPrincipal = (KeycloakPrincipal) servletRequest.getUserPrincipal();
声明。
Keycloak 主体不包含我需要的有关已验证用户的所有信息。 是否可以自定义我自己的主体类型? 在 keycloak-server-end 上,我开发了一个用户联合提供程序。我看到 UserModel 可以为我的用户添加一组自定义属性。
是否可以在该代码中插入我的自定义委托人?
是否可以从 keycloak 主体检索此属性?
路在何方?
要添加自定义属性,您需要做三件事:
- 将属性添加到管理控制台
- 添加声明映射
- 访问声明
第一个在这里解释得很好:https://www.keycloak.org/docs/latest/server_admin/index.html#user-attributes
添加声明映射:
- 打开您领域的管理控制台。
- 转到客户端并打开您的客户端
- 这仅适用于“设置”>“访问类型机密”或public(非仅承载)
- 转到映射器
- 创建一个从您的属性到 json 的映射
- 勾选"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(...);
}
希望这对您有所帮助并适合您的用例。我将其用于添加自定义主题的自定义属性。
Select 用户 > 查找 > 单击 ID > 转到属性选项卡 > 添加属性 > 例如:phone > 保存
Select 客户端 > 单击客户端 ID > 转到映射器选项卡 > 创建映射器
获取自定义属性
更新
在组级别添加 'phone' 属性,将用户分配到该组,您将从组级别获得所有用户的 'phone' 属性
返回 mapper 并用 'Aggregate attribute values = true' 和 'Multivalued=true' 更新 'phone',你会得到 'phone' 作为列表,其中包含组和用户级别。如果保留 'Aggregate attribute values = false' 或 'Multivalued=false',您只会得到一个值,其中用户的 'phone' 属性将覆盖组的 'phone' 属性(这很有意义)