创建keycloak客户端并以编程方式从其他客户端分配角色

时间:2019-11-19 15:29:24

标签: java keycloak

我想创建一个新客户端,然后将其分配给该客户端角色“视图用户”,该角色由“领域管理”客户端拥有。 目标:我将能够通过此新客户端列出用户。

我能够创建客户端,但不能为该客户端分配角色: 建立连接

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);

但是当我在创建客户端期间创建角色或稍后尝试分配它时,即使方法调用不返回异常,也不会分配角色。

1 个答案:

答案 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()));