Skip to content

Instantly share code, notes, and snippets.

@igorstojanovski
Created July 28, 2019 19:44
Show Gist options
  • Save igorstojanovski/b992ce23d90e20eb8242af98d9376ab8 to your computer and use it in GitHub Desktop.
Save igorstojanovski/b992ce23d90e20eb8242af98d9376ab8 to your computer and use it in GitHub Desktop.
Using the Keycloak client to create a user, set a real role and then delete it.
package io.aktivator;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.keycloak.admin.client.Keycloak;
import org.keycloak.admin.client.KeycloakBuilder;
import org.keycloak.admin.client.resource.RealmResource;
import org.keycloak.admin.client.resource.RolesResource;
import org.keycloak.admin.client.resource.UsersResource;
import org.keycloak.representations.AccessTokenResponse;
import org.keycloak.representations.idm.ClientRepresentation;
import org.keycloak.representations.idm.CredentialRepresentation;
import org.keycloak.representations.idm.RoleRepresentation;
import org.keycloak.representations.idm.UserRepresentation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import javax.ws.rs.core.Response;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
@Component
@Scope("singleton")
public class KeycloakClientTest {
private final String realm;
private final String client;
private AccessTokenResponse accessToken;
private final Keycloak keycloak;
@Autowired
public WebClientToken(@Value("${keycloak.auth-server-url}") String serverUrl,
@Value("${keycloak.realm}") String realm,
@Value("${aktivator.keycloak.resource-web-test}") String client,
@Value("${aktivator.keycloak.credentials.secret-web-test}") String secret,
@Value("${aktivator.keycloak.user}") String keycloakUser,
@Value("${aktivator.keycloak.password}") String keycloakPassword) {
this.realm = realm;
this.client = client;
keycloak = KeycloakBuilder.builder()
.serverUrl(serverUrl)
.realm(realm)
.username(keycloakUser)
.password(keycloakPassword)
.clientId(client)
.clientSecret(secret)
.resteasyClient(new ResteasyClientBuilder().connectionPoolSize(20).build())
.build();
accessToken = keycloak.tokenManager().getAccessToken();
}
void createUser() {
UserRepresentation user = new UserRepresentation();
user.setEnabled(true);
user.setUsername("tester14");
user.setFirstName("First");
user.setLastName("Last");
user.setEmail("tester15@outlook.com");
user.setAttributes(Collections.singletonMap("origin", Arrays.asList("demo")));
// Get realm
RealmResource realmResource = keycloak.realm(realm);
UsersResource userResource = realmResource.users();
// Create user (requires manage-users role)
Response response = userResource.create(user);
assertThat(response.getStatusInfo().getReasonPhrase()).isEqualTo("Created");
String userId = response.getLocation().getPath().replaceAll(".*/([^/]+)$", "$1");
RoleRepresentation testerRealmRole = realmResource.roles().get("activist").toRepresentation();
System.out.printf("User created with userId: %s%n", userId);
userResource.get(userId).roles().realmLevel().add(Collections.singletonList(testerRealmRole));
// Get client
ClientRepresentation app1Client = realmResource.clients().findByClientId(client).get(0);
// Get client level role (requires view-clients role)
RolesResource roles = realmResource.roles();
RoleRepresentation userClientRole = roles.get("activist").toRepresentation();
// Assign client level role to user
userResource.get(userId).roles().realmLevel().add(Collections.singletonList(userClientRole));
userResource.get(userId).remove();
}
public String getValue() {
return accessToken.getToken();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment