diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/CustomObjectMapper.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/CustomObjectMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..e9ddc72b578c5b6276954bc1a6f40997e0ced8b4 --- /dev/null +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/CustomObjectMapper.java @@ -0,0 +1,12 @@ +package de.ozgcloud.operator.keycloak; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; + +class CustomObjectMapper { + public static ObjectMapper createObjectMapper() { + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return mapper; + } +} diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakClient.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakClient.java index 2ada3f4152c04d3ba9c383f76d33e0165197c5f7..e562c74176a968000f8dec92520ed5a1ada10cbb 100644 --- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakClient.java +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakClient.java @@ -31,6 +31,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; +import com.fasterxml.jackson.databind.ObjectMapper; + import io.fabric8.kubernetes.api.model.Secret; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.dsl.Resource; @@ -83,4 +85,9 @@ public class KeycloakClient { private String decodeBase64(String base64String) { return new String(Base64.getDecoder().decode(base64String)); } + + @Bean + public ObjectMapper objectMapper() { + return CustomObjectMapper.createObjectMapper(); + } } diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java index b7eaf46451275d84d21b1a5a2a604f1b49ee716c..531d1bf1887fcd10a4642cbde5d283b1ac5b8661 100644 --- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java @@ -34,23 +34,27 @@ import org.springframework.stereotype.Component; import de.ozgcloud.operator.keycloak.KeycloakException; import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +@Log4j2 @RequiredArgsConstructor @Component class KeycloakRealmRemoteService { private final Keycloak keycloak; - public void createRealm(RealmRepresentation realm) { - keycloak.realms().create(realm); + public void createRealm(RealmRepresentation realmRepresentation) { + removeUnknownFields(realmRepresentation); + keycloak.realms().create(realmRepresentation); } public void deleteRealm(String realmName) { keycloak.realm(realmName).remove(); } - public void updateRealm(RealmRepresentation realm) { - keycloak.realm(realm.getRealm()).update(realm); + public void updateRealm(RealmRepresentation realmRepresentation) { + removeUnknownFields(realmRepresentation); + keycloak.realm(realmRepresentation.getRealm()).update(realmRepresentation); } public Optional<RoleRepresentation> getRealmRole(String roleName, String realmName) { @@ -71,6 +75,7 @@ class KeycloakRealmRemoteService { } UPConfig getUserProfileConfig(RealmRepresentation realmRepresentation) { + removeUnknownFields(realmRepresentation); return keycloak.realm(realmRepresentation.getRealm()) .users() .userProfile() @@ -78,9 +83,20 @@ class KeycloakRealmRemoteService { } void updateUserProfileConfig(RealmRepresentation realmRepresentation, UPConfig userProfileConfig) { + removeUnknownFields(realmRepresentation); keycloak.realm(realmRepresentation.getRealm()) .users() .userProfile() .update(userProfileConfig); } + + private void removeUnknownFields(RealmRepresentation realmRepresentation) { + try { + var field = RealmRepresentation.class.getDeclaredField("organizationsEnabled"); + field.setAccessible(true); + field.set(realmRepresentation, null); + } catch (Exception e) { + LOG.error("Error on removing unknown fields", e); + } + } }