简体   繁体   中英

Creating keycloak users through spring boot

I am trying to create a keycloak object to register new user with keycloak with the following code:

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. 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 eBank.Customer.controller.CustomerController$$FastClassBySpringCGLIB$$8c9f9beb.invoke(<generated>) ~[classes/:na]

Below are my keycloak dependencies:

<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. Include these two dependencies in the pom.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.

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. The next step would be to get the realm as realm manages users.

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

Finally now you can create user by using 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. You might find alternatives here

I wouldn't use keycloak-admin-client neither. Admin API is quite well documented . 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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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