我想创建一个新客户端,然后将其分配给该客户端角色“视图用户”,该角色由“领域管理”客户端拥有。 目标:我将能够通过此新客户端列出用户。
我能够创建客户端,但不能为该客户端分配角色: 建立连接
public Keycloak keycloakAdmin() {
return KeycloakBuilder.builder()
.serverUrl("http://localhost:" + environment.getRequiredProperty("keycloak.port") + "/auth")
.realm("master")
.clientId("admin-cli")
.username("admin")
.password("password")
.build();
}
然后我创建客户端
ClientRepresentation encourageClient = new ClientRepresentation();
encourageClient.setId("my-client");
encourageClient.setSecret("password");
encourageClient.setDirectAccessGrantsEnabled(true);
encourageClient.setServiceAccountsEnabled(true);
keycloakAdmin.realm("my-realm").clients().create(encourageClient);
但是当我在创建客户端期间创建角色或稍后尝试分配它时,即使方法调用不返回异常,也不会分配角色。
答案 0 :(得分:2)
棘手的部分是,如果我需要服务帐户用户,然后代表该用户分配角色。 同样让我花了很长时间的是,我创建的客户端具有相同的ClientRepresentation.getId()和ClientRepresentation.getClientId()(“ my-client”),但是对于其他客户端而言,它们可能完全不同,因此我需要getId()
RealmResource myRealm = keycloakAdmin.realm("my-realm");
String userId = myRealm.clients().get("my-client").getServiceAccountUser().getId();
UserResource serviceAccountUser = myRealm.users().get(userId);
ClientRepresentation clientThatOwnsRole = myRealm.clients()
.findByClientId("realm-management").get(0);
String clientIdOfRoleOwner = clientThatOwnsRole.getId();
ClientResource clientResourceOfRoleOwner = myRealm.clients().get(clientIdOfRoleOwner);
RoleResource roleResourceToAssign = clientResourceOfRoleOwner.roles().get("view-users");
serviceAccountUser.roles().clientLevel(clientIdOfRoleOwner).add(Collections.singletonList(roleResourceToAssign.toRepresentation()));