From 91963d91f37d7bf46e7b235c10241684acaacffc Mon Sep 17 00:00:00 2001 From: Santeri Korri Date: Sat, 7 Dec 2024 09:03:19 +0200 Subject: [PATCH] =?UTF-8?q?OY-4962=20P=C3=A4ivitetty=20Spring=20Boot=20ver?= =?UTF-8?q?sio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 92 +++++++------------ sijoittelu-algoritmi-batch/pom.xml | 7 -- sijoittelu-service/pom.xml | 22 ++++- .../configuration/SecurityConfiguration.java | 85 +++++++++-------- .../SijoitteluAktivointiResource.java | 2 +- .../security/AuthorityCheckService.java | 6 +- .../impl/JatkuvaSijoitteluServiceImpl.java | 2 +- .../sijoittelu/jatkuva/util/SecurityUtil.java | 6 +- .../laskenta/resource/StaticResource.java | 2 +- .../business/SijoitteluBusinessService.java | 1 - .../business/ValintatulosWithVastaanotto.java | 1 - .../security/AuthorityCheckServiceTest.java | 4 +- .../testing/TestConfigurationWithMocks.java | 6 +- sijoittelu-tulos-service/pom.xml | 6 +- 14 files changed, 115 insertions(+), 127 deletions(-) diff --git a/pom.xml b/pom.xml index 589e32ada..49bc3803f 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.14 + 3.3.5 fi.vm.sade.sijoittelu @@ -40,14 +40,12 @@ 2.15.2 - 5.3.29 - 5.7.10 + 6.3.4 3.1.2 1.6.11 6.0.1-SNAPSHOT - 5.18-SNAPSHOT + 6.2-SNAPSHOT 6.2.4.Final - 2.7.14 @@ -88,6 +86,21 @@ + + fi.vm.sade.valintaperusteet + valintaperusteet-api + ${valintaperusteet-api.version} + + + jakarta.servlet + jakarta.servlet-api + + + jakarta.ws.rs + jakarta.ws.rs-api + + + fi.vm.sade.tarjonta tarjonta-api @@ -115,7 +128,7 @@ fi.vm.sade.java-utils opintopolku-cas-servlet-filter - 0.2.0-SNAPSHOT + 1.0.0-SNAPSHOT fi.vm.sade.java-utils @@ -127,33 +140,6 @@ auditlogger 9.2.1-SNAPSHOT - - org.springframework.boot - spring-boot-starter-web - ${spring.boot.version} - - - org.springframework.boot - spring-boot-starter-webflux - ${spring.boot.version} - - - org.springframework.boot - spring-boot-starter-security - ${spring.boot.version} - - - org.springframework - spring-test - ${spring.version} - test - - - org.mockito - mockito-all - - - org.springdoc springdoc-openapi-ui @@ -182,12 +168,12 @@ fi.vm.sade.java-utils opintopolku-user-details-service - 0.3.0-SNAPSHOT + 0.5.1-SNAPSHOT fi.vm.sade.valinta valinta-sharedutils - 5.11-SNAPSHOT + 6.0-SNAPSHOT org.hibernate.orm @@ -215,17 +201,6 @@ spring-boot-starter-validation 3.1.0 - - org.slf4j - slf4j-api - 1.7.5 - - - org.junit.jupiter - junit-jupiter-api - 5.7.0 - test - org.hamcrest hamcrest @@ -314,14 +289,22 @@ 2.0.1 - ch.qos.logback - logback-access - 1.2.13 + ch.qos.logback.access + tomcat + 2.0.3 + + - ch.qos.logback - logback-classic - 1.2.13 + fi.vm.sade.valintaperusteet + sharedutils + 6.0-SNAPSHOT + + + org.slf4j + slf4j-reload4j + + @@ -395,11 +378,6 @@ commons-codec 1.9 - - commons-logging - commons-logging - 1.2 - org.checkerframework checker-qual diff --git a/sijoittelu-algoritmi-batch/pom.xml b/sijoittelu-algoritmi-batch/pom.xml index 240cd2453..ffe843a52 100644 --- a/sijoittelu-algoritmi-batch/pom.xml +++ b/sijoittelu-algoritmi-batch/pom.xml @@ -35,7 +35,6 @@ fi.vm.sade.valintaperusteet valintaperusteet-api - ${valintaperusteet-api.version} @@ -43,12 +42,6 @@ spring-context - - - org.slf4j - slf4j-api - - org.junit.jupiter diff --git a/sijoittelu-service/pom.xml b/sijoittelu-service/pom.xml index 670f73e5a..0f7743b6a 100644 --- a/sijoittelu-service/pom.xml +++ b/sijoittelu-service/pom.xml @@ -46,6 +46,10 @@ org.springframework.boot spring-boot-starter-jdbc + + org.springframework.boot + spring-boot-starter-logging + org.springdoc springdoc-openapi-ui @@ -89,12 +93,16 @@ fi.vm.sade.valintaperusteet valintaperusteet-api + + + fi.vm.sade.valintaperusteet + sharedutils + fi.vm.sade.valintaperusteet valintaperusteet-api - ${valintaperusteet-api.version} @@ -199,11 +207,17 @@ ch.qos.logback - logback-access + logback-classic - ch.qos.logback - logback-classic + ch.qos.logback.access + tomcat + + + + + fi.vm.sade.valintaperusteet + sharedutils diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/SecurityConfiguration.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/SecurityConfiguration.java index 1f289fd90..d2384a98c 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/SecurityConfiguration.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/SecurityConfiguration.java @@ -2,9 +2,9 @@ import fi.vm.sade.java_utils.security.OpintopolkuCasAuthenticationFilter; import fi.vm.sade.javautils.kayttooikeusclient.OphUserDetailsServiceImpl; -import org.jasig.cas.client.session.SingleSignOutFilter; -import org.jasig.cas.client.validation.Cas20ProxyTicketValidator; -import org.jasig.cas.client.validation.TicketValidator; +import org.apereo.cas.client.session.SingleSignOutFilter; +import org.apereo.cas.client.validation.Cas20ProxyTicketValidator; +import org.apereo.cas.client.validation.TicketValidator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -12,6 +12,8 @@ import org.springframework.context.annotation.Profile; import org.springframework.core.annotation.Order; import org.springframework.core.env.Environment; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.cas.ServiceProperties; import org.springframework.security.cas.authentication.CasAuthenticationProvider; import org.springframework.security.cas.web.CasAuthenticationEntryPoint; @@ -20,14 +22,14 @@ import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; 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.SecurityFilterChain; @Configuration @Order(2) @EnableMethodSecurity(securedEnabled = true) @EnableWebSecurity @Profile("!test") -public class SecurityConfiguration extends WebSecurityConfigurerAdapter { +public class SecurityConfiguration { private Environment environment; private String service; @@ -61,10 +63,8 @@ public ServiceProperties serviceProperties() { @Bean public CasAuthenticationProvider casAuthenticationProvider() { - final String host = environment.getProperty("host.alb", environment.getRequiredProperty("host.virkailija")); CasAuthenticationProvider casAuthenticationProvider = new CasAuthenticationProvider(); - casAuthenticationProvider.setUserDetailsService( - new OphUserDetailsServiceImpl(host, SijoitteluServiceConfiguration.CALLER_ID)); + casAuthenticationProvider.setAuthenticationUserDetailsService(new OphUserDetailsServiceImpl()); casAuthenticationProvider.setServiceProperties(serviceProperties()); casAuthenticationProvider.setTicketValidator(ticketValidator()); casAuthenticationProvider.setKey(this.key); @@ -83,9 +83,12 @@ public TicketValidator ticketValidator() { // @Bean - public CasAuthenticationFilter casAuthenticationFilter() throws Exception { - OpintopolkuCasAuthenticationFilter casAuthenticationFilter = new OpintopolkuCasAuthenticationFilter(serviceProperties()); - casAuthenticationFilter.setAuthenticationManager(authenticationManager()); + public CasAuthenticationFilter casAuthenticationFilter( + ServiceProperties serviceProperties, AuthenticationManager authenticationManager) + throws Exception { + OpintopolkuCasAuthenticationFilter casAuthenticationFilter = + new OpintopolkuCasAuthenticationFilter(serviceProperties); + casAuthenticationFilter.setAuthenticationManager(authenticationManager); casAuthenticationFilter.setFilterProcessesUrl("/j_spring_cas_security_check"); return casAuthenticationFilter; } @@ -115,35 +118,39 @@ public CasAuthenticationEntryPoint casAuthenticationEntryPoint() { return casAuthenticationEntryPoint; } - @Override - protected void configure(HttpSecurity http) throws Exception { - http.headers() - .disable() - .csrf() - .disable() - .authorizeHttpRequests() - .regexMatchers("^/?$") - .permitAll() - .regexMatchers("^/buildversion.txt$") - .permitAll() - .regexMatchers("^/swagger-ui(/.*)?") - .permitAll() - .regexMatchers("^/swagger(/.*)?") - .permitAll() - .regexMatchers("^/v3/api-docs(/.*)?") - .permitAll() - .anyRequest() - .authenticated() - .and() - .addFilter(casAuthenticationFilter()) - .exceptionHandling() - .authenticationEntryPoint(casAuthenticationEntryPoint()) - .and() - .addFilterBefore(singleSignOutFilter(), CasAuthenticationFilter.class); + @Bean + public SecurityFilterChain configureFilterChain( + HttpSecurity http, + CasAuthenticationFilter casAuthenticationFilter, + SingleSignOutFilter singleSignOutFilter, + CasAuthenticationEntryPoint casAuthenticationEntryPoint) + throws Exception { + return http.headers(h -> h.disable()) + .csrf(c -> c.disable()) + .authorizeHttpRequests( + requests -> + requests + .requestMatchers( + HttpMethod.GET, + "/buildversion.txt", + "/swagger-ui/**", + "/swagger/**", + "/v3/api-docs", + "/v3/api-docs/**") + .permitAll() + .anyRequest() + .fullyAuthenticated()) + .exceptionHandling(e -> e.authenticationEntryPoint(casAuthenticationEntryPoint)) + .addFilter(casAuthenticationFilter) + .addFilterBefore(singleSignOutFilter, CasAuthenticationFilter.class) + .build(); } - @Override - protected void configure(AuthenticationManagerBuilder auth) { - auth.authenticationProvider(casAuthenticationProvider()); + @Bean + protected AuthenticationManager configure( + HttpSecurity http, CasAuthenticationProvider casAuthenticationProvider) throws Exception { + return http.getSharedObject(AuthenticationManagerBuilder.class) + .authenticationProvider(casAuthenticationProvider) + .build(); } } diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/resource/SijoitteluAktivointiResource.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/resource/SijoitteluAktivointiResource.java index 8fb3230a9..bc90fbcac 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/resource/SijoitteluAktivointiResource.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/resource/SijoitteluAktivointiResource.java @@ -26,7 +26,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/security/AuthorityCheckService.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/security/AuthorityCheckService.java index 0aacffb3d..fcc948f80 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/security/AuthorityCheckService.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/security/AuthorityCheckService.java @@ -8,11 +8,11 @@ import io.reactivex.Observable; import java.util.Collection; import java.util.Set; -import javax.ws.rs.ForbiddenException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Profile; +import org.springframework.security.access.AccessDeniedException; import org.springframework.security.core.GrantedAuthority; import org.springframework.stereotype.Service; @@ -43,7 +43,7 @@ public void checkAuthorizationForHaku(String hakuOid, Collection require String.format( "Käyttäjällä ei oikeutta haun %s tarjoajaan tai sen yläorganisaatioihin.", hakuOid); LOG.error(msg); - throw new ForbiddenException(msg); + throw new AccessDeniedException(msg); } } @@ -72,7 +72,7 @@ public boolean isAuthorizedForAnyParentOid( "Organisaatioiden %s parentOids -haku epäonnistui", String.join(", ", organisaatioOids)); LOG.error(msg, e); - throw new ForbiddenException(msg); + throw new AccessDeniedException(msg); } return false; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/impl/JatkuvaSijoitteluServiceImpl.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/impl/JatkuvaSijoitteluServiceImpl.java index 157c4f5cb..835b28f3f 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/impl/JatkuvaSijoitteluServiceImpl.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/impl/JatkuvaSijoitteluServiceImpl.java @@ -11,7 +11,7 @@ import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; -import javax.ws.rs.NotAuthorizedException; +import jakarta.ws.rs.NotAuthorizedException; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.quartz.*; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/util/SecurityUtil.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/util/SecurityUtil.java index c45c0d25a..f93fef5d6 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/util/SecurityUtil.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/util/SecurityUtil.java @@ -6,10 +6,10 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.ws.rs.ForbiddenException; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.security.access.AccessDeniedException; import org.springframework.security.cas.authentication.CasAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; @@ -93,13 +93,13 @@ public static Collection getRoles() { SecurityContext context = SecurityContextHolder.getContext(); if (context == null) { String msg = "No SecurityContext found"; - throw new ForbiddenException(msg); + throw new AccessDeniedException(msg); } Authentication authentication = context.getAuthentication(); if (authentication == null) { String msg = "No Authentication found in SecurityContext"; - throw new ForbiddenException(msg); + throw new AccessDeniedException(msg); } return authentication.getAuthorities(); diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/resource/StaticResource.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/resource/StaticResource.java index e6b3c774b..8deb7a5fe 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/resource/StaticResource.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/resource/StaticResource.java @@ -6,7 +6,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @Hidden diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/service/business/SijoitteluBusinessService.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/service/business/SijoitteluBusinessService.java index 2ca9979af..91edc359b 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/service/business/SijoitteluBusinessService.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/service/business/SijoitteluBusinessService.java @@ -47,7 +47,6 @@ import org.springframework.stereotype.Service; import org.springframework.util.StopWatch; -import javax.ws.rs.WebApplicationException; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/service/business/ValintatulosWithVastaanotto.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/service/business/ValintatulosWithVastaanotto.java index 2489056c0..6e5e6a393 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/service/business/ValintatulosWithVastaanotto.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/service/business/ValintatulosWithVastaanotto.java @@ -9,7 +9,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.ws.rs.WebApplicationException; import java.util.*; import java.util.stream.Collectors; diff --git a/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/jatkuva/security/AuthorityCheckServiceTest.java b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/jatkuva/security/AuthorityCheckServiceTest.java index 7513405b3..9cd0fc74b 100644 --- a/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/jatkuva/security/AuthorityCheckServiceTest.java +++ b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/jatkuva/security/AuthorityCheckServiceTest.java @@ -12,7 +12,6 @@ import java.util.HashSet; import java.util.Set; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.ForbiddenException; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; @@ -21,6 +20,7 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import org.springframework.security.access.AccessDeniedException; import org.springframework.security.core.GrantedAuthority; public class AuthorityCheckServiceTest { @@ -97,7 +97,7 @@ public void testIsAuthorizedForAnyParentOid() { @Test public void testCheckAuthorizationForHaku() { Assertions.assertThrows( - ForbiddenException.class, + AccessDeniedException.class, () -> authorityCheckService.checkAuthorizationForHaku("haku.oid", Collections.EMPTY_SET)); } } diff --git a/sijoittelu-service/src/test/java/fi/vm/sade/testing/TestConfigurationWithMocks.java b/sijoittelu-service/src/test/java/fi/vm/sade/testing/TestConfigurationWithMocks.java index 496263077..896d175a6 100644 --- a/sijoittelu-service/src/test/java/fi/vm/sade/testing/TestConfigurationWithMocks.java +++ b/sijoittelu-service/src/test/java/fi/vm/sade/testing/TestConfigurationWithMocks.java @@ -4,8 +4,8 @@ import fi.vm.sade.auditlog.Audit; import fi.vm.sade.javautils.nio.cas.CasClient; import fi.vm.sade.javautils.opintopolku_spring_security.Authorizer; -import fi.vm.sade.service.valintaperusteet.resource.ValintaperusteetResource; -import fi.vm.sade.service.valintaperusteet.resource.ValintaperusteetResourceV2; +//import fi.vm.sade.service.valintaperusteet.resource.ValintaperusteetResource; +//import fi.vm.sade.service.valintaperusteet.resource.ValintaperusteetResourceV2; import fi.vm.sade.sijoittelu.laskenta.external.resource.*; import fi.vm.sade.sijoittelu.laskenta.mapping.SijoitteluModelMapper; import fi.vm.sade.sijoittelu.laskenta.service.business.ValintarekisteriService; @@ -50,11 +50,13 @@ public ValintalaskentaFlywayMigrationDone doValintalaskentaFlywayMigration() { return new ValintalaskentaFlywayMigrationDone(); } +/* @Bean public ValintaperusteetResource valintaperusteetResource() { return Mockito.mock(ValintaperusteetResource.class); } @Bean public ValintaperusteetResourceV2 valintaperusteetResourceV2() { return Mockito.mock(ValintaperusteetResourceV2.class); } +*/ @Bean public OhjausparametriResource ohjausparametriResource() { return Mockito.mock(OhjausparametriResource.class); } diff --git a/sijoittelu-tulos-service/pom.xml b/sijoittelu-tulos-service/pom.xml index 44302f5bb..df3f0367d 100644 --- a/sijoittelu-tulos-service/pom.xml +++ b/sijoittelu-tulos-service/pom.xml @@ -26,7 +26,7 @@ sijoittelu-tulos-api ${project.version} - + com.fasterxml.jackson.core jackson-core @@ -35,10 +35,6 @@ com.fasterxml.jackson.core jackson-annotations - - org.slf4j - slf4j-api - fi.vm.sade.java-utils opintopolku-user-details-service