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

标签 java keycloak

我想创建新的客户端,然后分配给这个客户端角色“view-users”,它由“realm-management”客户端拥有。 目标:我将能够通过这个新客户端列出用户。

我可以创建客户,但不能为该客户分配角色: 创建连接

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

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

最佳答案

棘手的部分是我需要服务帐户用户,然后代表该用户分配角色。 还花了我很长时间的是,我创建的客户端具有相同的 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()));

关于java - 创建 keycloak 客户端并以编程方式从其他客户端分配角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58937537/

相关文章:

single-sign-on - Keycloak:外部 IdP 的无效 SAML 响应

python - 使用 keycloak 进行 flask 应用程序 OAuth 登录的 ssl.SSLCertVerificationError

java - 无法使 Keycloak Tomcat 7 适配器​​工作(版本 3.4.3.Final)

java - ICEFaces/RichFaces/PrimeFaces 应用程序是 RIA 吗?

java - 正在等待第 3 方库 (OpenMap/Java) 的线程完成?

java - 我试图通过 spring 框架将图像路径存储在 mysql 数据库中...但无法做到这一点.. :/

java - 朴素素数测试优化

curl - 对 docker 后面的 keycloak 的 token 请求,curl 有效,reactjs 无效

oauth-2.0 - keycloak token 自省(introspection)总是失败,出现 {"active":false}

java - 不使用trim()从字符串的开头和结尾删除空格