KeyCloak - 以编程方式创建领域/用户/组?

Posted

技术标签:

【中文标题】KeyCloak - 以编程方式创建领域/用户/组?【英文标题】:KeyCloak - Create Realms/Users/Groups Programmatically? 【发布时间】:2019-01-02 10:53:14 【问题描述】:

我们决定将身份和访问管理解决方案转移到 KeyCloak,而不是完全在我们的 Java EE Web 应用程序中实施。我们正在创建一个多租户解决方案,并且更愿意通过我们的工作流程以编程方式创建安全领域/用户/组,而不是利用 KeyCloak 的自助注册功能或 Web UI,以便我们可以执行诸如获取信用卡详细信息以进行付款之类的操作等。我知道我们可能会利用admin REST APIs 来完成此任务,但我不确定除了手动编码 REST 调用之外是否还有更简单的方法。 KeyCloak 是否提供我们可以使用的管理客户端库?还是我们自己为管理 API 实现了一个 REST 客户端?

【问题讨论】:

【参考方案1】:

我在KeyCloak Java Admin Client 周围找到了一些信息。 This gist 有很多有用的示例展示如何管理用户、领域等。

【讨论】:

您是否找到有关该 API 的任何文档? 仅供参考,gist url 现在已损坏【参考方案2】:
Keycloak kc = KeycloakBuilder.builder() 
            .serverUrl("https://localhost:8443/auth")
            .realm("master")
            .username("admin") 
            .password("admin") 
            .clientId("Mycli") 
            .resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build()) 
            .build();

    CredentialRepresentation credential = new CredentialRepresentation();
    credential.setType(CredentialRepresentation.PASSWORD);
    credential.setValue("test123");

    UserRepresentation user = new UserRepresentation();
    user.setUsername("testuser2");
    user.setFirstName("Test2");
    user.setLastName("User2");
    user.setEmail("aaa@bbb.com");
    user.setCredentials(Arrays.asList(credential));
    user.setEnabled(true);
    user.setRealmRoles(Arrays.asList("admin"));

    // Create testuser
    Response result = kc.realm("my-realem").users().create(user);
    if (result.getStatus() != 201) 
        System.err.println("Couldn't create user.");
        System.exit(0);
    else
        System.out.println("Testuser created.... verify in keycloak!");
    

【讨论】:

【参考方案3】:

Keycloak Java adapters 专注于使用而不是配置。您需要实现自己使用所需参数进行必要的调用。有一种工具可以解决这种问题,admin-cli,但我认为它对您的情况没有用处。

【讨论】:

【参考方案4】:

您可以使用 Keycloak Java admin REST api 客户端执行此操作:

    为您的项目添加依赖项:

    马文
    <dependency>
        <groupId>org.keycloak</groupId>
        <artifactId>keycloak-admin-client</artifactId>
        <version>15.0.2</version>
    </dependency> 
    
    分级
    implementation 'org.keycloak:keycloak-admin-client:15.0.2'
    

    使用KeycloakBuilder 创建Keycloak 的实例,使用管理员用户和默认admin-cli 客户端的密码身份验证:

Keycloak keycloak = KeycloakBuilder.builder()
            .serverUrl("http://localhost:8081/auth")
            .realm("master")
            .clientId("admin-cli")
            .username("admin")
            .password("admin")
            .build();
    要创建新领域,请使用RealmRepresentation
RealmRepresentation rr = new RealmRepresentation();
rr.setId("test-realm");
rr.setRealm("test-realm");
rr.setEnabled(true);

keycloak.realms().create(rr);
    要创建新用户,请使用UserRepresentation
CredentialRepresentation credential = new CredentialRepresentation();
credential.setType(CredentialRepresentation.PASSWORD);
credential.setValue("1234");

UserRepresentation user = new UserRepresentation();
user.setUsername("test");
user.setFirstName("test");
user.setLastName("test");
user.setEmail("test@gmail.com");
user.setCredentials(Arrays.asList(credential));
user.setEnabled(true);
user.setRealmRoles(Arrays.asList("admin"));

keycloak.realm("test-realm").users().create(user);
    要创建一个新组,请使用GroupRepresentation
GroupRepresentation groupRepresentation = new GroupRepresentation()
groupRepresentation.setName("group");

Response response = keycloak.realm("test-realm").groups().add(groupRepresentation);

请注意,在创建新的***组时,您不应传递组 id - 您可以在创建组后检索它。

【讨论】:

以上是关于KeyCloak - 以编程方式创建领域/用户/组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 rest admin api 的情况下以编程方式(java)更新 keycloak 的用户详细信息?

Keycloak - 是不是可以在领域之间共享一组共同的用户?

仅创建用户 Keycloak 角色?

服务器端使用 Bearer 令牌以编程方式在 Java 中验证 Keycloak 用户

Keycloak-向用户配置文件中添加角色

无法在 keycloak 中创建用户。获取 403 状态