From 8acc80b95a6a8702fc1ef79e0288e39aeefee8b1 Mon Sep 17 00:00:00 2001 From: giovanni frison <giovanni.frison@consultant.aruba.it> Date: Mon, 17 Feb 2025 17:12:24 +0100 Subject: [PATCH 1/3] SIMPL-10085 added disable/enable kc user endpoints changelog: added --- .gitignore | 1 + .../controllers/UserController.java | 10 +++++ .../controllers/UserControllerV1.java | 10 +++++ .../services/KeycloakUserService.java | 3 ++ .../impl/KeycloakUserServiceImpl.java | 27 ++++++++++++++ src/main/resources/application-local.yml | 37 ------------------- 6 files changed, 51 insertions(+), 37 deletions(-) delete mode 100644 src/main/resources/application-local.yml diff --git a/.gitignore b/.gitignore index 549e00a2..f19d3e8b 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ build/ ### VS Code ### .vscode/ +/src/main/resources/application-local.yml diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserController.java b/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserController.java index c2303680..5d119f1c 100644 --- a/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserController.java +++ b/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserController.java @@ -93,4 +93,14 @@ public class UserController implements UserExchange { log.info("Received POST request for importing [{}] users and relative roles", users.size()); userService.importUsers(users); } + + public void disableUser(String userId) { + log.info("Received DISABLE request for user with uuid [{}]", userId); + userService.disableUser(userId); + } + + public void enableUser(String userId) { + log.info("Received ENABLE request for user with uuid [{}]", userId); + userService.enableUser(userId); + } } diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserControllerV1.java b/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserControllerV1.java index 2516f4e0..a2da237d 100644 --- a/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserControllerV1.java +++ b/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserControllerV1.java @@ -35,6 +35,16 @@ public class UserControllerV1 implements UsersApi { controller.deleteUser(uuid); } + @Override + public void disableUser(String userId) { + controller.disableUser(userId); + } + + @Override + public void enableUser(String userId) { + controller.enableUser(userId); + } + @Override public List<KeycloakRoleDTO> getRoles(String uuid) { return mapper.toV1(controller.getRoles(uuid)); diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/services/KeycloakUserService.java b/src/main/java/eu/europa/ec/simpl/usersroles/services/KeycloakUserService.java index 659a5150..b23a3121 100644 --- a/src/main/java/eu/europa/ec/simpl/usersroles/services/KeycloakUserService.java +++ b/src/main/java/eu/europa/ec/simpl/usersroles/services/KeycloakUserService.java @@ -50,4 +50,7 @@ public interface KeycloakUserService { List<RoleRepresentation> getRoleList(); void logout(); + + void disableUser(String userId); + void enableUser(String userId); } diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImpl.java b/src/main/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImpl.java index dd98d238..0681791d 100644 --- a/src/main/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImpl.java +++ b/src/main/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImpl.java @@ -13,12 +13,15 @@ import jakarta.ws.rs.ClientErrorException; import jakarta.ws.rs.NotFoundException; import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.Response; + import java.util.List; import java.util.Objects; import java.util.UUID; import java.util.regex.Pattern; + import lombok.extern.log4j.Log4j2; import org.keycloak.admin.client.resource.RoleResource; +import org.keycloak.admin.client.resource.UsersResource; import org.keycloak.representations.idm.RoleRepresentation; import org.keycloak.representations.idm.UserRepresentation; import org.springframework.http.HttpStatus; @@ -324,4 +327,28 @@ public class KeycloakUserServiceImpl implements KeycloakUserService { throw new KeycloakException(e.getResponse()); } } + + @Override + public void disableUser(String userId) { + try { + var userResource = keycloakService.getAppRealm().users().get(userId); + var user = userResource.toRepresentation(); + user.setEnabled(false); + userResource.update(user); + } catch (ClientErrorException e) { + throw new KeycloakException(e.getResponse()); + } + } + + @Override + public void enableUser(String userId) { + try { + var userResource = keycloakService.getAppRealm().users().get(userId); + var user = userResource.toRepresentation(); + user.setEnabled(true); + userResource.update(user); + } catch (ClientErrorException e) { + throw new KeycloakException(e.getResponse()); + } + } } diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml deleted file mode 100644 index 66418326..00000000 --- a/src/main/resources/application-local.yml +++ /dev/null @@ -1,37 +0,0 @@ -spring: - datasource: - url: jdbc:postgresql://localhost:5432/usersroles - username: usersroles - password: usersroles - jpa: - properties: - hibernate: - generate_statistics: false - format_sql: true - -logging: - config: classpath:log4j2-local.xml - -keycloak: - url: http://localhost:9010/auth - master: - user: user - password: admin - app: - realm: participant - client-id: frontend-cli - client-to-realm-role-migration: - enabled: false # Set to true to import realm roles from client roles - client-ids: [ "frontend-cli"] -client: - authority: - url: https://tls.authority.aruba-simpl.cloud - -server: - port: 8081 - -microservice: - identity-provider: - url: http://localhost:8081 - authentication-provider: - url: http://localhost:8085 -- GitLab From 79fc2d495dc674202982e12a9323a337b98d7af1 Mon Sep 17 00:00:00 2001 From: giovanni frison <giovanni.frison@consultant.aruba.it> Date: Mon, 17 Feb 2025 17:14:01 +0100 Subject: [PATCH 2/3] SIMPL-10085 added test coverage changelog: added --- .../impl/KeycloakUserServiceImplTest.java | 47 +++++++++++++++++-- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/src/test/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImplTest.java b/src/test/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImplTest.java index 73e00698..3d767370 100644 --- a/src/test/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImplTest.java +++ b/src/test/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImplTest.java @@ -26,11 +26,7 @@ import java.util.UUID; import org.instancio.Instancio; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.keycloak.admin.client.resource.RealmResource; -import org.keycloak.admin.client.resource.RoleByIdResource; -import org.keycloak.admin.client.resource.RoleResource; -import org.keycloak.admin.client.resource.RolesResource; -import org.keycloak.admin.client.resource.UsersResource; +import org.keycloak.admin.client.resource.*; import org.keycloak.representations.idm.RoleRepresentation; import org.keycloak.representations.idm.UserRepresentation; import org.mockito.Answers; @@ -516,4 +512,45 @@ class KeycloakUserServiceImplTest { when(response.getStatus()).thenReturn(500); return clientErrorException; } + + @Test + void disable_success() { + var userResource = mock(UserResource.class); + var userRepresentation = an(UserRepresentation.class); + var userId = UUID.randomUUID().toString(); + given(keycloakService.getAppRealm().users().get(userId)).willReturn(userResource); + given(userResource.toRepresentation()).willReturn(userRepresentation); + assertDoesNotThrow(() -> keycloakUserService.disableUser(userId)); + } + + @Test + void disable_error() { + var exception = generateClientErrorException(); + var userResource = mock(UserResource.class); + var userId = UUID.randomUUID().toString(); + given(keycloakService.getAppRealm().users().get(userId)).willReturn(userResource); + given(userResource.toRepresentation()).willThrow(exception); + assertThrows(KeycloakException.class, () -> keycloakUserService.disableUser(userId)); + } + + @Test + void enable_success() { + var userResource = mock(UserResource.class); + var userRepresentation = an(UserRepresentation.class); + var userId = UUID.randomUUID().toString(); + given(keycloakService.getAppRealm().users().get(userId)).willReturn(userResource); + given(userResource.toRepresentation()).willReturn(userRepresentation); + assertDoesNotThrow(() -> keycloakUserService.enableUser(userId)); + } + + @Test + void enable_error() { + var exception = generateClientErrorException(); + var userResource = mock(UserResource.class); + var userId = UUID.randomUUID().toString(); + given(keycloakService.getAppRealm().users().get(userId)).willReturn(userResource); + given(userResource.toRepresentation()).willThrow(exception); + assertThrows(KeycloakException.class, () -> keycloakUserService.enableUser(userId)); + } + } -- GitLab From bbce23454ff7c553659ddd29f100455a8c36aeca Mon Sep 17 00:00:00 2001 From: giovanni frison <giovanni.frison@consultant.aruba.it> Date: Wed, 19 Feb 2025 12:20:01 +0100 Subject: [PATCH 3/3] SIMPL-7613 reverted changes to respect belgif changelog: deleted --- .../configurations/ClientConfig.java | 2 +- .../controllers/UserController.java | 10 ---- .../controllers/UserControllerV1.java | 10 ---- .../services/KeycloakUserService.java | 3 -- .../impl/KeycloakUserServiceImpl.java | 27 ----------- .../impl/KeycloakUserServiceImplTest.java | 47 ++----------------- 6 files changed, 6 insertions(+), 93 deletions(-) diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/configurations/ClientConfig.java b/src/main/java/eu/europa/ec/simpl/usersroles/configurations/ClientConfig.java index 101d7c4c..a3531c0d 100644 --- a/src/main/java/eu/europa/ec/simpl/usersroles/configurations/ClientConfig.java +++ b/src/main/java/eu/europa/ec/simpl/usersroles/configurations/ClientConfig.java @@ -84,7 +84,7 @@ public class ClientConfig { KeyPairExchange.class); } - private <E> E buildExchange(URI baseurl, RestClient.Builder restClientBuilder, Class<E> clazz) { + private static <E> E buildExchange(URI baseurl, RestClient.Builder restClientBuilder, Class<E> clazz) { var restClient = restClientBuilder .baseUrl(baseurl) .requestFactory(new JdkClientHttpRequestFactory()) diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserController.java b/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserController.java index 5d119f1c..c2303680 100644 --- a/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserController.java +++ b/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserController.java @@ -93,14 +93,4 @@ public class UserController implements UserExchange { log.info("Received POST request for importing [{}] users and relative roles", users.size()); userService.importUsers(users); } - - public void disableUser(String userId) { - log.info("Received DISABLE request for user with uuid [{}]", userId); - userService.disableUser(userId); - } - - public void enableUser(String userId) { - log.info("Received ENABLE request for user with uuid [{}]", userId); - userService.enableUser(userId); - } } diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserControllerV1.java b/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserControllerV1.java index a2da237d..2516f4e0 100644 --- a/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserControllerV1.java +++ b/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserControllerV1.java @@ -35,16 +35,6 @@ public class UserControllerV1 implements UsersApi { controller.deleteUser(uuid); } - @Override - public void disableUser(String userId) { - controller.disableUser(userId); - } - - @Override - public void enableUser(String userId) { - controller.enableUser(userId); - } - @Override public List<KeycloakRoleDTO> getRoles(String uuid) { return mapper.toV1(controller.getRoles(uuid)); diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/services/KeycloakUserService.java b/src/main/java/eu/europa/ec/simpl/usersroles/services/KeycloakUserService.java index b23a3121..659a5150 100644 --- a/src/main/java/eu/europa/ec/simpl/usersroles/services/KeycloakUserService.java +++ b/src/main/java/eu/europa/ec/simpl/usersroles/services/KeycloakUserService.java @@ -50,7 +50,4 @@ public interface KeycloakUserService { List<RoleRepresentation> getRoleList(); void logout(); - - void disableUser(String userId); - void enableUser(String userId); } diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImpl.java b/src/main/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImpl.java index 0681791d..dd98d238 100644 --- a/src/main/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImpl.java +++ b/src/main/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImpl.java @@ -13,15 +13,12 @@ import jakarta.ws.rs.ClientErrorException; import jakarta.ws.rs.NotFoundException; import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.Response; - import java.util.List; import java.util.Objects; import java.util.UUID; import java.util.regex.Pattern; - import lombok.extern.log4j.Log4j2; import org.keycloak.admin.client.resource.RoleResource; -import org.keycloak.admin.client.resource.UsersResource; import org.keycloak.representations.idm.RoleRepresentation; import org.keycloak.representations.idm.UserRepresentation; import org.springframework.http.HttpStatus; @@ -327,28 +324,4 @@ public class KeycloakUserServiceImpl implements KeycloakUserService { throw new KeycloakException(e.getResponse()); } } - - @Override - public void disableUser(String userId) { - try { - var userResource = keycloakService.getAppRealm().users().get(userId); - var user = userResource.toRepresentation(); - user.setEnabled(false); - userResource.update(user); - } catch (ClientErrorException e) { - throw new KeycloakException(e.getResponse()); - } - } - - @Override - public void enableUser(String userId) { - try { - var userResource = keycloakService.getAppRealm().users().get(userId); - var user = userResource.toRepresentation(); - user.setEnabled(true); - userResource.update(user); - } catch (ClientErrorException e) { - throw new KeycloakException(e.getResponse()); - } - } } diff --git a/src/test/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImplTest.java b/src/test/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImplTest.java index 3d767370..73e00698 100644 --- a/src/test/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImplTest.java +++ b/src/test/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImplTest.java @@ -26,7 +26,11 @@ import java.util.UUID; import org.instancio.Instancio; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.keycloak.admin.client.resource.*; +import org.keycloak.admin.client.resource.RealmResource; +import org.keycloak.admin.client.resource.RoleByIdResource; +import org.keycloak.admin.client.resource.RoleResource; +import org.keycloak.admin.client.resource.RolesResource; +import org.keycloak.admin.client.resource.UsersResource; import org.keycloak.representations.idm.RoleRepresentation; import org.keycloak.representations.idm.UserRepresentation; import org.mockito.Answers; @@ -512,45 +516,4 @@ class KeycloakUserServiceImplTest { when(response.getStatus()).thenReturn(500); return clientErrorException; } - - @Test - void disable_success() { - var userResource = mock(UserResource.class); - var userRepresentation = an(UserRepresentation.class); - var userId = UUID.randomUUID().toString(); - given(keycloakService.getAppRealm().users().get(userId)).willReturn(userResource); - given(userResource.toRepresentation()).willReturn(userRepresentation); - assertDoesNotThrow(() -> keycloakUserService.disableUser(userId)); - } - - @Test - void disable_error() { - var exception = generateClientErrorException(); - var userResource = mock(UserResource.class); - var userId = UUID.randomUUID().toString(); - given(keycloakService.getAppRealm().users().get(userId)).willReturn(userResource); - given(userResource.toRepresentation()).willThrow(exception); - assertThrows(KeycloakException.class, () -> keycloakUserService.disableUser(userId)); - } - - @Test - void enable_success() { - var userResource = mock(UserResource.class); - var userRepresentation = an(UserRepresentation.class); - var userId = UUID.randomUUID().toString(); - given(keycloakService.getAppRealm().users().get(userId)).willReturn(userResource); - given(userResource.toRepresentation()).willReturn(userRepresentation); - assertDoesNotThrow(() -> keycloakUserService.enableUser(userId)); - } - - @Test - void enable_error() { - var exception = generateClientErrorException(); - var userResource = mock(UserResource.class); - var userId = UUID.randomUUID().toString(); - given(keycloakService.getAppRealm().users().get(userId)).willReturn(userResource); - given(userResource.toRepresentation()).willThrow(exception); - assertThrows(KeycloakException.class, () -> keycloakUserService.enableUser(userId)); - } - } -- GitLab