简体   繁体   English

通过spring引导创建keycloak用户

[英]Creating keycloak users through spring boot

I am trying to create a keycloak object to register new user with keycloak with the following code:我正在尝试创建一个 keycloak object 以使用以下代码使用 keycloak 注册新用户:

public Keycloak getInstance() {
    if (keycloak == null) {

        return KeycloakBuilder.builder()
                .realm(realm)
                .serverUrl(serverURL)
                .clientId(clientID)
                .clientSecret(clientSecret)
                .grantType(OAuth2Constants.CLIENT_CREDENTIALS)
                .build();
    }
    return keycloak;
}

But i keep getting the following error:但我不断收到以下错误:

java.lang.ClassCastException: class org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl cannot be cast to class javax.ws.rs.client.ClientBuilder (org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl and javax.ws.rs.client.ClientBuilder are in unnamed module of loader 'app') at org.keycloak.admin.client.ClientBuilderWrapper.create(ClientBuilderWrapper.java:29) ~[keycloak-admin-client-17.0.1.jar:17.0.1] at org.keycloak.admin.client.spi.ResteasyClientClassicProvider.newRestEasyClient(ResteasyClientClassicProvider.java:35) ~[keycloak-admin-client-17.0.1.jar:17.0.1] at org.keycloak.admin.client.Keycloak.newRestEasyClient(Keycloak.java:98) ~[keycloak-admin-client-17.0.1. java.lang.ClassCastException: class org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl cannot be cast to class javax.ws.rs.client.ClientBuilder (org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl and javax .ws.rs.client.ClientBuilder 位于 org.keycloak.admin.client.ClientBuilderWrapper.create(ClientBuilderWrapper.java:29) 的加载程序“app”的未命名模块中~[keycloak-admin-client-17.0.1.Z68995FCBF432492D15484DAC04 :17.0.1] at org.keycloak.admin.client.spi.ResteasyClientClassicProvider.newRestEasyClient(ResteasyClientClassicProvider.java:35) ~[keycloak-admin-client-17.0.1.jar:17.0.1] at org.keycloak.admin .client.Keycloak.newRestEasyClient(Keycloak.java:98) ~[keycloak-admin-client-17.0.1. jar:17.0.1] at org.keycloak.admin.client.Keycloak.<init>(Keycloak.java:89) ~[keycloak-admin-client-17.0.1.jar:17.0.1] at org.keycloak.admin.client.KeycloakBuilder.build(KeycloakBuilder.java:146) ~[keycloak-admin-client-17.0.1.jar:17.0.1] at com.microfinanceBank.Customer.Config.KeycloakProvider.getInstance(KeycloakProvider.java:41) ~[classes/:na] at com.microfinanceBank.Customer.service.KeycloakAdminClientServices.wow(KeycloakAdminClientServices.java:31) ~[classes/:na] at com.microfinanceBank.Customer.controller.CustomerController.getCustomer(CustomerController.java:68) ~[classes/:na] at com.microfinanc jar:17.0.1] at org.keycloak.admin.client.Keycloak.<init>(Keycloak.java:89) ~[keycloak-admin-client-17.0.1.jar:17.0.1] at org.keycloak. admin.client.KeycloakBuilder.build(KeycloakBuilder.java:146) ~[keycloak-admin-client-17.0.1.jar:17.0.1] at com.microfinanceBank.Customer.Config.KeycloakProvider.getInstance(KeycloakProvider.java:41 ) ~[classes/:na] at com.microfinanceBank.Customer.service.KeycloakAdminClientServices.wow(KeycloakAdminClientServices.java:31) ~[classes/:na] at com.microfinanceBank.Customer.controller.CustomerController.getCustomer(CustomerController.java :68) ~[classes/:na] 在 com.microfinanc eBank.Customer.controller.CustomerController$$FastClassBySpringCGLIB$$8c9f9beb.invoke(<generated>) ~[classes/:na] eBank.Customer.controller.CustomerController$$FastClassBySpringCGLIB$$8c9f9beb.invoke(<generated>) ~[classes/:na]

Below are my keycloak dependencies:以下是我的 keycloak 依赖项:

<dependency>
   <groupId>org.keycloak</groupId>
   <artifactId>keycloak-admin-client</artifactId>
   <version>17.0.1</version>
</dependency>
<dependency>
   <groupId>org.jboss.resteasy</groupId>
   <artifactId>resteasy-client</artifactId>
   <version>6.1.0.Alpha1</version>
</dependency>
<dependency>
   <groupId>org.jboss.resteasy</groupId>
   <artifactId>resteasy-jackson2-provider</artifactId>
   <version>6.1.0.Alpha1</version>
</dependency>
<dependency>
   <groupId>org.jboss.resteasy</groupId>
   <artifactId>resteasy-multipart-provider</artifactId>
   <version>6.1.0.Alpha1</version>
</dependency>
<dependency>
   <groupId>com.guicedee.services</groupId>
   <artifactId>jakarta.ws.rs-api</artifactId>
   <version>1.2.2.1</version>
</dependency>

What am i doing wrong?我究竟做错了什么?

I have tried adding some dependencies yet keep getting error.我尝试添加一些依赖项,但一直出错。 Please what should i do.Thanks in advance请问我该怎么办。在此先感谢

You can use keycloak's SDK for your springboot application.您可以将 keycloak 的 SDK 用于您的 springboot 应用程序。 Include these two dependencies in the pom.xmlpom.xml中包含这两个依赖项

<dependency>
  <groupId>org.keycloak</groupId>
  <artifactId>keycloak-spring-boot-starter</artifactId>
  <version>18.0.2</version>
</dependency>
<dependency>
  <groupId>org.keycloak</groupId>
  <artifactId>keycloak-admin-client</artifactId>
  <version>18.0.2</version>
</dependency>

After that create a keycloak's instance in your springboot application.之后在你的 springboot 应用程序中创建一个 keycloak 的实例。

public Keycloak getAdminKeycloakUser() {
    return KeycloakBuilder.builder().serverUrl("keycloak-auth-url")
            .grantType("password").realm("realm-name")
            .clientId("client-id")
            .username("admin-user")
            .password("admin-password")
            .resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build()).build();
}

The above method will get you the admin user which is needed in order to create users into Keycloak.上述方法将为您提供在 Keycloak 中创建用户所需的管理员用户。 The next step would be to get the realm as realm manages users.下一步是获取 realm,因为 realm 管理用户。

public RealmResource getRealm() {
    return getAdminKeycloakUser().realm(realm);
}

Finally now you can create user by using org.keycloak.representations.idm.UserRepresentation .最后,现在您可以使用org.keycloak.representations.idm.UserRepresentation创建用户。

public void createUser() {
    UserRepresentation userRepresentation = new UserRepresentation();

    userRepresentation.setUsername("username");
    userRepresentation.setFirstName("first-name");
    userRepresentation.setLastName("last-name");
    userRepresentation.setEmail("test@email.com");

    Response response = getRealm().realmResource.users().create(userRepresentation);
    //If user is created successfully 200 is returned for response status.

    //Set password flow
    CredentialRepresentation passwordCred = new CredentialRepresentation();
    String userId = CreatedResponseUtil.getCreatedId(response);
    passwordCred.setTemporary(false);
    passwordCred.setType("password");
    passwordCred.setValue("some-password");
    UserResource userResource = realmResource.users().get(userId);
    userResource.resetPassword(passwordCred);
}

keycloak-spring-boot-starter is deprecated , don't use it. keycloak-spring-boot-starter已弃用,请勿使用。 You might find alternatives here你可能会在这里找到替代品

I wouldn't use keycloak-admin-client neither.我也不会使用keycloak-admin-client Admin API is quite well documented .管理员 API 有据可查 Just use your favorite REST client (with spring-boot features to configure OAuth2 REST client if you like) and POST a request to your Keycloak server.只需使用您最喜欢的 REST 客户端(如果您愿意,可以使用 spring-boot 功能来配置 OAuth2 REST 客户端)并向您的 Keycloak 服务器发送请求。

UserRepresentation userRepresentation = new UserRepresentation();
userRepresentation.setUsername("username");
userRepresentation.setFirstName("first-name");
userRepresentation.setLastName("last-name");
userRepresentation.setEmail("test@email.com");
// set other required values

javax.ws.rs.core.Response response = KeycloakBuilder.builder().build().realm("your-realm-nam").users().create(userRepresentation);
if (response != null && response.getStatusInfo().getFamily() == Family.SUCCESSFUL) 
{
    return org.keycloak.admin.client.CreatedResponseUtil.getCreatedId(response);        // returns String (Id of created User)
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM