From 6edd5ffca7609bee5dd1983d7f18e373e70a5cf3 Mon Sep 17 00:00:00 2001 From: "ioannis.diplas" Date: Wed, 18 Dec 2019 11:09:03 +0000 Subject: [PATCH] Replacing XML with Java configuration --- .../config/AaiSecurityConfiguration.java | 179 ++++++++++++++++++ .../config/CascadingPropertyLoader.java | 3 +- .../config/DatasourceConfiguration.java | 59 ++++++ .../config/GlobalSecurityConfiguration.java | 19 ++ .../manager/config/RedisConfiguration.java | 79 ++++++++ .../manager/service/PiWikServiceImpl.java | 1 - src/main/resources/application-context.xml | 41 +--- src/main/resources/application.properties | 2 +- src/main/webapp/WEB-INF/aai-security.xml | 157 --------------- .../webapp/WEB-INF/applicationContext.xml | 25 --- src/main/webapp/WEB-INF/web.xml | 1 - src/test/resources/application-context.xml | 43 +---- src/test/resources/applicationContext.xml | 29 --- 13 files changed, 356 insertions(+), 282 deletions(-) create mode 100644 src/main/java/eu/dnetlib/repo/manager/config/AaiSecurityConfiguration.java create mode 100644 src/main/java/eu/dnetlib/repo/manager/config/DatasourceConfiguration.java create mode 100644 src/main/java/eu/dnetlib/repo/manager/config/GlobalSecurityConfiguration.java create mode 100644 src/main/java/eu/dnetlib/repo/manager/config/RedisConfiguration.java delete mode 100644 src/main/webapp/WEB-INF/aai-security.xml diff --git a/src/main/java/eu/dnetlib/repo/manager/config/AaiSecurityConfiguration.java b/src/main/java/eu/dnetlib/repo/manager/config/AaiSecurityConfiguration.java new file mode 100644 index 0000000..7e2d82d --- /dev/null +++ b/src/main/java/eu/dnetlib/repo/manager/config/AaiSecurityConfiguration.java @@ -0,0 +1,179 @@ +package eu.dnetlib.repo.manager.config; + +import org.mitre.oauth2.model.ClientDetailsEntity.AuthMethod; +import org.mitre.oauth2.model.RegisteredClient; +import org.mitre.openid.connect.client.OIDCAuthenticationFilter; +import org.mitre.openid.connect.client.OIDCAuthenticationProvider; +import org.mitre.openid.connect.client.service.impl.*; +import org.mitre.openid.connect.config.ServerConfiguration; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint; +import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +@Configuration +@EnableWebSecurity +public class AaiSecurityConfiguration extends WebSecurityConfigurerAdapter { + + @Value("${webapp.dev.front}") + private String logoutSuccessUrl; + + @Value("${oidc.issuer}") + private String oidcIssuer; + + @Value("${oidc.id}") + private String oidcId; + + @Value("${oidc.secret}") + private String oidcSecret; + + @Value("${oidc.dev.home}") + private String oidcDevHome; + + @Value("${webapp.dev.front}") + private String webAppFrontEnd; + + private Map userRoles = new HashMap(){{ + put("urn:geant:openaire.eu:group:Super+Administrator#aai.openaire.eu", "ROLE_ADMIN"); + put("urn:geant:openaire.eu:group:Content+Provider+Dashboard+Administrator#aai.openaire.eu","ROLE_PROVIDE_ADMIN"); + }}; + + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return authenticationManager(); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.authenticationProvider(openIdConnectAuthenticationProvider()); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf().disable() + .anonymous().disable() + .authorizeRequests() + .anyRequest().authenticated() + .and() + .httpBasic() + .authenticationEntryPoint(authenticationEntryPoint()) + .and() + .logout().logoutUrl("/openid_logout") + .invalidateHttpSession(true) + .deleteCookies("openAIRESession") + .logoutSuccessUrl(logoutSuccessUrl) + .and() + .addFilterBefore(openIdConnectAuthenticationFilter(), AbstractPreAuthenticatedProcessingFilter.class) + ; + } + + @Bean + public OIDCAuthenticationProvider openIdConnectAuthenticationProvider(){ + OIDCAuthenticationProvider oidcProvider = new OIDCAuthenticationProvider(); + oidcProvider.setAuthoritiesMapper(authoritiesMapper()); + return oidcProvider; + } + + @Bean + public OpenAireProviderAuthoritiesMapper authoritiesMapper(){ + OpenAireProviderAuthoritiesMapper authoritiesMapper = new OpenAireProviderAuthoritiesMapper(userRoles); + return authoritiesMapper; + } + + @Bean + public StaticServerConfigurationService staticServerConfigurationService(){ + StaticServerConfigurationService staticServerConfigurationService = new StaticServerConfigurationService(); + Map servers = new HashMap<>(); + servers.put(oidcIssuer, serverConfiguration()); + staticServerConfigurationService.setServers(servers); + return staticServerConfigurationService; + } + + @Bean + public StaticClientConfigurationService staticClientConfigurationService(){ + StaticClientConfigurationService staticClientConfigurationService = new StaticClientConfigurationService(); + Map clients = new HashMap<>(); + clients.put(oidcIssuer,registeredClient()); + staticClientConfigurationService.setClients(clients); + return staticClientConfigurationService; + } + + @Bean + public RegisteredClient registeredClient(){ + RegisteredClient registeredClient = new RegisteredClient(); + registeredClient.setClientId(oidcId); + registeredClient.setClientSecret(oidcSecret); + registeredClient.setScope(new HashSet<>(Collections.singletonList("openid"))); + registeredClient.setTokenEndpointAuthMethod(AuthMethod.SECRET_BASIC); + registeredClient.setRedirectUris(new HashSet<>(Collections.singletonList(oidcDevHome))); + return registeredClient; + } + + @Bean + public StaticAuthRequestOptionsService staticAuthRequestOptionsService(){ + return new StaticAuthRequestOptionsService(); + } + + @Bean + public PlainAuthRequestUrlBuilder plainAuthRequestUrlBuilder(){ + return new PlainAuthRequestUrlBuilder(); + } + + @Bean + public ServerConfiguration serverConfiguration(){ + ServerConfiguration serverConfiguration = new ServerConfiguration(); + serverConfiguration.setIssuer(oidcIssuer); + serverConfiguration.setAuthorizationEndpointUri(oidcIssuer+"authorize"); + serverConfiguration.setTokenEndpointUri(oidcIssuer+"token"); + serverConfiguration.setUserInfoUri(oidcIssuer+"userinfo"); + serverConfiguration.setJwksUri(oidcIssuer+"jwk"); + serverConfiguration.setRevocationEndpointUri(oidcIssuer+"revoke"); + return serverConfiguration; + } + + @Bean + public LoginUrlAuthenticationEntryPoint authenticationEntryPoint(){ + return new LoginUrlAuthenticationEntryPoint("/openid_connect_login"); + } + + + @Bean + public OIDCAuthenticationFilter openIdConnectAuthenticationFilter() throws Exception { + OIDCAuthenticationFilter oidc = new OIDCAuthenticationFilter(); + oidc.setAuthenticationManager(authenticationManagerBean()); + oidc.setIssuerService(staticSingleIssuerService()); + oidc.setServerConfigurationService(staticServerConfigurationService()); + oidc.setClientConfigurationService(staticClientConfigurationService()); + oidc.setAuthRequestOptionsService(staticAuthRequestOptionsService()); + oidc.setAuthRequestUrlBuilder(plainAuthRequestUrlBuilder()); + oidc.setAuthenticationSuccessHandler(frontEndRedirect()); + return oidc; + } + + @Bean + public StaticSingleIssuerService staticSingleIssuerService(){ + StaticSingleIssuerService staticSingleIssuerService = new StaticSingleIssuerService(); + staticSingleIssuerService.setIssuer(oidcIssuer); + return staticSingleIssuerService; + } + + @Bean(initMethod = "init") + public FrontEndLinkURIAuthenticationSuccessHandler frontEndRedirect(){ + FrontEndLinkURIAuthenticationSuccessHandler frontEnd = new FrontEndLinkURIAuthenticationSuccessHandler(); + frontEnd.setFrontEndURI(webAppFrontEnd); + return frontEnd; + } + +} diff --git a/src/main/java/eu/dnetlib/repo/manager/config/CascadingPropertyLoader.java b/src/main/java/eu/dnetlib/repo/manager/config/CascadingPropertyLoader.java index 019f42a..bc0af97 100644 --- a/src/main/java/eu/dnetlib/repo/manager/config/CascadingPropertyLoader.java +++ b/src/main/java/eu/dnetlib/repo/manager/config/CascadingPropertyLoader.java @@ -52,4 +52,5 @@ public class CascadingPropertyLoader extends PropertyPlaceholderConfigurer imple this.properties = properties; } -} \ No newline at end of file +} + diff --git a/src/main/java/eu/dnetlib/repo/manager/config/DatasourceConfiguration.java b/src/main/java/eu/dnetlib/repo/manager/config/DatasourceConfiguration.java new file mode 100644 index 0000000..1b0c95b --- /dev/null +++ b/src/main/java/eu/dnetlib/repo/manager/config/DatasourceConfiguration.java @@ -0,0 +1,59 @@ +package eu.dnetlib.repo.manager.config; + +import org.apache.commons.dbcp.BasicDataSource; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@Configuration +@EnableTransactionManagement +public class DatasourceConfiguration { + + private static Logger LOGGER = Logger.getLogger(DatasourceConfiguration.class); + + @Value("${repomanager.db.driverClassName}") + private String driverClassname; + + @Value("${repomanager.db.url}") + private String URL; + + @Value("${repomanager.db.username}") + private String username; + + @Value("${repomanager.db.password}") + private String password; + + @Bean + public BasicDataSource dataSource(){ + BasicDataSource basicDataSource = new BasicDataSource(); + basicDataSource.setDriverClassName(driverClassname); + basicDataSource.setUrl(URL); + basicDataSource.setUsername(username); + basicDataSource.setPassword(password); + basicDataSource.setMaxIdle(10); + basicDataSource.setMaxActive(100); + basicDataSource.setMaxWait(1000); + basicDataSource.setValidationQuery("SELECT 1;"); + basicDataSource.setTestOnBorrow(true); + basicDataSource.setTestOnReturn(true); + basicDataSource.setTestWhileIdle(true); + basicDataSource.setTimeBetweenEvictionRunsMillis(1200000); + basicDataSource.setMinEvictableIdleTimeMillis(1800000); + basicDataSource.setMinEvictableIdleTimeMillis(5); + basicDataSource.setPoolPreparedStatements(true); + basicDataSource.setDefaultAutoCommit(true); + + return basicDataSource; + } + + @Bean + public DataSourceTransactionManager txManager(){ + DataSourceTransactionManager txManager = new DataSourceTransactionManager(); + txManager.setDataSource(dataSource()); + return txManager; + } + +} diff --git a/src/main/java/eu/dnetlib/repo/manager/config/GlobalSecurityConfiguration.java b/src/main/java/eu/dnetlib/repo/manager/config/GlobalSecurityConfiguration.java new file mode 100644 index 0000000..b6eb25a --- /dev/null +++ b/src/main/java/eu/dnetlib/repo/manager/config/GlobalSecurityConfiguration.java @@ -0,0 +1,19 @@ +package eu.dnetlib.repo.manager.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; +import org.springframework.web.multipart.commons.CommonsMultipartResolver; + +@Configuration +@EnableGlobalMethodSecurity(prePostEnabled = true,proxyTargetClass = true) +public class GlobalSecurityConfiguration extends GlobalMethodSecurityConfiguration { + + @Bean + public CommonsMultipartResolver multipartResolver(){ + CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); + multipartResolver.setMaxUploadSize(268435456); + return multipartResolver; + } +} diff --git a/src/main/java/eu/dnetlib/repo/manager/config/RedisConfiguration.java b/src/main/java/eu/dnetlib/repo/manager/config/RedisConfiguration.java new file mode 100644 index 0000000..167545f --- /dev/null +++ b/src/main/java/eu/dnetlib/repo/manager/config/RedisConfiguration.java @@ -0,0 +1,79 @@ +package eu.dnetlib.repo.manager.config; + +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; +import org.springframework.context.annotation.*; +import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; +import org.springframework.session.web.http.CookieSerializer; +import org.springframework.session.web.http.DefaultCookieSerializer; +import org.springframework.web.client.RestTemplate; + +import javax.annotation.PostConstruct; + +@Configuration +@EnableRedisHttpSession +@EnableAspectJAutoProxy +@EnableCircuitBreaker +@PropertySource(value = {"classpath:application.properties"} ) +@ComponentScan(basePackages = { + "org.eurocris.openaire.cris.validator.service", + "eu.dnetlib.repo.manager.*"}) +public class RedisConfiguration { + + private static Logger LOGGER = Logger.getLogger(RedisConfiguration.class); + + @Value("${redis.host}") + private String host; + + @Value("${redis.port:6379}") + private String port; + + @Value("${redis.password}") + private String password; + + @Value("${aai.mode}") + private String aai_mode; + + @PostConstruct + private void init(){ + LOGGER.info(String.format("Redis : %s Port : %s Password : %s",host,port,password)); + } + + @Bean + public JedisConnectionFactory connectionFactory() { + LOGGER.info(String.format("Redis : %s Port : %s Password : %s",host,port,password)); + JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(); + jedisConnectionFactory.setHostName(host); + jedisConnectionFactory.setPort(Integer.parseInt(port)); + jedisConnectionFactory.setUsePool(true); + if(password != null) jedisConnectionFactory.setPassword(password); + return jedisConnectionFactory; + } + + @Bean + public CookieSerializer cookieSerializer() { + DefaultCookieSerializer serializer = new DefaultCookieSerializer(); + serializer.setCookieName("openAIRESession"); + serializer.setCookiePath("/"); + if(aai_mode.equalsIgnoreCase("production") || aai_mode.equalsIgnoreCase("beta")) + serializer.setDomainName(".openaire.eu"); +// serializer.setDomainName(".athenarc.gr"); + LOGGER.info("Serializer : " + serializer); + return serializer; + } + + @Bean + public RestTemplate restTemplate() { + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.set("Content-Type", "application/json"); + return restTemplate; + } + + +} diff --git a/src/main/java/eu/dnetlib/repo/manager/service/PiWikServiceImpl.java b/src/main/java/eu/dnetlib/repo/manager/service/PiWikServiceImpl.java index 1164b0f..5f6ae13 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/PiWikServiceImpl.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/PiWikServiceImpl.java @@ -32,7 +32,6 @@ import java.util.Map; @Service("piwikService") public class PiWikServiceImpl implements PiWikService { - @Qualifier("repomanager.dataSource") @Autowired private DataSource dataSource; diff --git a/src/main/resources/application-context.xml b/src/main/resources/application-context.xml index ae07910..7d4c104 100644 --- a/src/main/resources/application-context.xml +++ b/src/main/resources/application-context.xml @@ -8,7 +8,6 @@ - @@ -29,39 +28,15 @@ classpath*:/application.properties classpath*:email-texts.properties - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 7390b5e..459dc30 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -141,7 +141,7 @@ oidc.secret=AMQtGlbTXNjwjhF0st28LmM6V0XypMdaVS7tJmGuYFlmH36iIv4t7tVqYuLYrNPkhnZ_ search.api.baseAddress=https://beta.services.openaire.eu/search/v2/api search.api.usagestats=https://services.openaire.eu/usagestats search.api.usageEvents=http://beta.lbs.openaire.eu:8080/ajax/summary -api.baseAddress=http://beta.services.openaire.eu/openaire +api.baseAddress=https://dev-openaire.d4science.org/openaire services.repo-manager.baseUrl=http://${container.hostname}:${container.port}/${container.context} services.repo-manager.adminEmail=antleb@di.uoa.gr services.repo-manager.repository.testing.mode=false diff --git a/src/main/webapp/WEB-INF/aai-security.xml b/src/main/webapp/WEB-INF/aai-security.xml deleted file mode 100644 index 93d14e7..0000000 --- a/src/main/webapp/WEB-INF/aai-security.xml +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - openid - - - - - - ${oidc.dev.home} - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/applicationContext.xml b/src/main/webapp/WEB-INF/applicationContext.xml index 72ee304..f6cc74e 100644 --- a/src/main/webapp/WEB-INF/applicationContext.xml +++ b/src/main/webapp/WEB-INF/applicationContext.xml @@ -67,31 +67,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 363cf07..96488d0 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -9,7 +9,6 @@ contextConfigLocation /WEB-INF/applicationContext.xml - /WEB-INF/aai-security.xml diff --git a/src/test/resources/application-context.xml b/src/test/resources/application-context.xml index 5684b24..7d4c104 100644 --- a/src/test/resources/application-context.xml +++ b/src/test/resources/application-context.xml @@ -8,7 +8,6 @@ - @@ -27,41 +26,17 @@ classpath*:/eu/**/springContext-*.properties classpath*:/application.properties - classpath*:/email-texts.properties + classpath*:email-texts.properties - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/test/resources/applicationContext.xml b/src/test/resources/applicationContext.xml index c5a6bc1..7928037 100644 --- a/src/test/resources/applicationContext.xml +++ b/src/test/resources/applicationContext.xml @@ -67,33 +67,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file