我已经从Keycloak的OIDC端点中提取了用户的组信息,但是它们没有我定义的组属性。是否有要求添加到我的请求中?
我正在使用RESTeasy客户端访问Keycloak的管理API(比使用提供的管理客户端要好得多):
@Path("/admin/realms/{realm}")
public interface KeycloakAdminService {
@GET
@Path("/users/{id}/groups")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
List<GroupRepresentation> getUserGroups(@PathParam("realm") String realm, @PathParam("id") String userId,
@HeaderParam(AUTHORIZATION) String accessToken);
//DEBUG the access token must always be prefixed by "Bearer "
}
所以我可以获取用户的网上论坛:
private void fetchUserGroups(UserInfoOIDC infos, String userId) {
log.info("Fetching user groups from {}...", getRealm());
try {
KeycloakAdminService proxy = kcTarget.proxy(KeycloakAdminService.class);
AccessTokenResponse response = authzClient.obtainAccessToken(getAdminUsername(), getAdminPassword());
List<GroupRepresentation> groups = proxy.getUserGroups(getRealm(), userId,
"Bearer " + response.getToken());
infos.importUserGroups(groups); //DEBUG here we go!
} catch (WebApplicationException e) {
log.error("User groups failure on {}: {}", getRealm(), e.getMessage());
}
}
但是,在进行数据探索时,事实证明GroupRepresentation#getAttributes结构中没有提供任何属性。
我已阅读到可以将声明添加到用户信息请求中。可以在admin API上使用吗?如何使用RESTeasy模板实现该结果? 谢谢
答案 0 :(得分:0)
我可以通过在令牌的其他声明属性中添加组/角色信息来实现这一目标:
为此在keycloak配置中,转到您的客户端->映射器并添加一个组/角色映射器。例如。
现在此信息将开始出现在您的访问令牌中
要访问Java中的这些组属性,可以从accesstoken的otherclaims
属性中提取它。例如:
KeycloakSecurityContext keycloakSecurityContext = (KeycloakSecurityContext)(request.getAttribute(KeycloakSecurityContext.class.getName()));
AccesToken token = keycloakSecurityContext.getToken();
在下图中,您可以看到token的otherclaims
属性充满了我们在keycloak上创建的groups属性。请注意,如果我们将“令牌声明属性”命名为groupXYZ,则otherclaims
将显示:
groupsXYZ=[Administrator]
答案 1 :(得分:0)