From e07c8919cd7f8f9419661f143dd455417a975681 Mon Sep 17 00:00:00 2001 From: BerndBreier <33351391+BerndBreier@users.noreply.github.com> Date: Mon, 18 Jun 2018 18:01:18 +0200 Subject: [PATCH] TSK-581 Separate configuration of LdapTemplate. Wire LdapTemplate conditionally. --- .../taskana/rest/ExampleRestApplication.java | 3 +- .../pro/taskana/rest/SampleConfiguration.java | 4 +- .../java/pro/taskana/ldap/LdapClient.java | 5 +- .../pro/taskana/ldap/LdapConfiguration.java | 69 +++++++++++++++++++ .../pro/taskana/rest/RestConfiguration.java | 47 ++----------- .../pro/taskana/rest/TestConfiguration.java | 3 +- 6 files changed, 83 insertions(+), 48 deletions(-) create mode 100644 rest/taskana-rest-spring/src/main/java/pro/taskana/ldap/LdapConfiguration.java diff --git a/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/ExampleRestApplication.java b/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/ExampleRestApplication.java index 31e868641..92da270fe 100644 --- a/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/ExampleRestApplication.java +++ b/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/ExampleRestApplication.java @@ -20,6 +20,7 @@ import org.springframework.transaction.PlatformTransactionManager; import pro.taskana.ldap.LdapCacheTestImpl; import pro.taskana.ldap.LdapClient; +import pro.taskana.ldap.LdapConfiguration; import pro.taskana.sampledata.SampleDataGenerator; /** @@ -27,7 +28,7 @@ import pro.taskana.sampledata.SampleDataGenerator; */ @SpringBootApplication @EnableScheduling -@Import(SampleConfiguration.class) +@Import({SampleConfiguration.class, LdapConfiguration.class, RestConfiguration.class}) public class ExampleRestApplication { @Autowired diff --git a/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/SampleConfiguration.java b/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/SampleConfiguration.java index 943539927..979a5fb88 100644 --- a/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/SampleConfiguration.java +++ b/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/SampleConfiguration.java @@ -1,7 +1,7 @@ package pro.taskana.rest; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Configuration; import pro.taskana.BulkOperationResults; import pro.taskana.TaskanaTransactionProvider; @@ -9,7 +9,7 @@ import pro.taskana.TaskanaTransactionProvider; /** * Configuration class for Spring sample application. */ -@Import(RestConfiguration.class) +@Configuration public class SampleConfiguration { @Bean diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/ldap/LdapClient.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/ldap/LdapClient.java index 4d4c1021d..5ea6b9c86 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/ldap/LdapClient.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/ldap/LdapClient.java @@ -31,13 +31,14 @@ import pro.taskana.rest.resource.AccessIdResource; @Component public class LdapClient { + public static final String TASKANA_USE_LDAP_PROP_NAME = "taskana.ldap.useLdap"; private static final Logger LOGGER = LoggerFactory.getLogger(LdapClient.class); private boolean active = false; @Autowired private Environment env; - @Autowired + @Autowired(required = false) private LdapTemplate ldapTemplate; private String userSearchBase; @@ -217,7 +218,7 @@ public class LdapClient { } public boolean useLdap() { - String useLdap = env.getProperty("taskana.ldap.useLdap"); + String useLdap = env.getProperty(TASKANA_USE_LDAP_PROP_NAME); if (useLdap == null || useLdap.isEmpty()) { return false; } else { diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/ldap/LdapConfiguration.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/ldap/LdapConfiguration.java new file mode 100644 index 000000000..931c3f312 --- /dev/null +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/ldap/LdapConfiguration.java @@ -0,0 +1,69 @@ +package pro.taskana.ldap; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.core.type.AnnotatedTypeMetadata; +import org.springframework.ldap.core.LdapTemplate; +import org.springframework.ldap.core.support.LdapContextSource; + +/** + * Configuration for Ldap access. + */ +@Configuration +public class LdapConfiguration { + + @Autowired + private Environment env; + + @Bean + public LdapContextSource contextSource() { + + LdapContextSource contextSource = new LdapContextSource(); + boolean useLdap; + String useLdapConfigValue = env.getProperty("taskana.ldap.useLdap"); + if (useLdapConfigValue == null || useLdapConfigValue.isEmpty()) { + useLdap = false; + } else { + useLdap = Boolean.parseBoolean(useLdapConfigValue); + } + if (useLdap) { + contextSource.setUrl(env.getRequiredProperty("taskana.ldap.serverUrl")); + contextSource.setBase(env.getRequiredProperty("taskana.ldap.baseDn")); + contextSource.setUserDn(env.getRequiredProperty("taskana.ldap.bindDn")); + contextSource.setPassword(env.getRequiredProperty("taskana.ldap.bindPassword")); + } else { + contextSource.setUrl("ldap://localhost:9999"); + contextSource.setBase("o=taskana"); + contextSource.setUserDn("user"); + contextSource.setPassword("secret"); + } + return contextSource; + } + + @Bean(name = "ldapTemplate") + @Conditional(WithLdapCondition.class) + public LdapTemplate getActiveLdapTemplate() { + return new LdapTemplate(contextSource()); + } + + /** + * Helper class to control conditional provision of LdapTemplate. + */ + public static class WithLdapCondition implements Condition { + + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + String useLdap = context.getEnvironment().getProperty(LdapClient.TASKANA_USE_LDAP_PROP_NAME); + if (useLdap == null || useLdap.isEmpty()) { + return false; + } else { + return Boolean.parseBoolean(useLdap); + } + } + } +} diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/RestConfiguration.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/RestConfiguration.java index 309ff7859..fe41ef4d1 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/RestConfiguration.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/RestConfiguration.java @@ -4,18 +4,14 @@ import java.sql.SQLException; import javax.sql.DataSource; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; -import org.springframework.core.env.Environment; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.http.converter.json.SpringHandlerInstantiator; -import org.springframework.ldap.core.LdapTemplate; -import org.springframework.ldap.core.support.LdapContextSource; import org.springframework.transaction.annotation.EnableTransactionManagement; import com.fasterxml.jackson.databind.cfg.HandlerInstantiator; @@ -37,44 +33,6 @@ import pro.taskana.ldap.LdapClient; @EnableTransactionManagement public class RestConfiguration { - @Autowired - private Environment env; - - @Bean - public LdapContextSource contextSource() { - - LdapContextSource contextSource = new LdapContextSource(); - boolean useLdap; - String useLdapConfigValue = env.getProperty("taskana.ldap.useLdap"); - if (useLdapConfigValue == null || useLdapConfigValue.isEmpty()) { - useLdap = false; - } else { - useLdap = Boolean.parseBoolean(useLdapConfigValue); - } - if (useLdap) { - contextSource.setUrl(env.getRequiredProperty("taskana.ldap.serverUrl")); - contextSource.setBase(env.getRequiredProperty("taskana.ldap.baseDn")); - contextSource.setUserDn(env.getRequiredProperty("taskana.ldap.bindDn")); - contextSource.setPassword(env.getRequiredProperty("taskana.ldap.bindPassword")); - } else { - contextSource.setUrl("ldap://localhost:9999"); - contextSource.setBase("o=taskana"); - contextSource.setUserDn("user"); - contextSource.setPassword("secret"); - } - return contextSource; - } - - @Bean - public LdapClient ldapClient() { - return new LdapClient(); - } - - @Bean - public LdapTemplate ldapTemplate() { - return new LdapTemplate(contextSource()); - } - @Bean public ClassificationService getClassificationService(TaskanaEngine taskanaEngine) { return taskanaEngine.getClassificationService(); @@ -107,6 +65,11 @@ public class RestConfiguration { return new SpringTaskanaEngineConfiguration(dataSource, true, true); } + @Bean + public LdapClient ldapClient() { + return new LdapClient(); + } + // Needed to override JSON De-/Serializer in Jackson. @Bean public Jackson2ObjectMapperBuilder jacksonBuilder(HandlerInstantiator handlerInstantiator) { diff --git a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/TestConfiguration.java b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/TestConfiguration.java index c64880c3f..ceb93e408 100644 --- a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/TestConfiguration.java +++ b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/TestConfiguration.java @@ -6,11 +6,12 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; import pro.taskana.configuration.TaskanaEngineConfiguration; +import pro.taskana.ldap.LdapConfiguration; /** * Configuration class for all rest tests. */ -@Import(RestConfiguration.class) +@Import({RestConfiguration.class, LdapConfiguration.class}) public class TestConfiguration { @Bean