From 8397b35f388e4bb3268b0edbf035ff7dc27365c6 Mon Sep 17 00:00:00 2001 From: aforcuti Date: Wed, 19 Feb 2025 12:18:43 +0100 Subject: [PATCH 1/4] Added support for expose swagger API --- pom.xml | 6 ++- .../cgn/portal/CGNOnboardingPortal.java | 15 +++++++- .../cgn/portal/config/OpenAPIConfig.java | 37 +++++++++++++++++++ .../portal/security/WebSecurityConfig.java | 5 ++- 4 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 src/main/java/it/gov/pagopa/cgn/portal/config/OpenAPIConfig.java diff --git a/pom.xml b/pom.xml index b98eccd5..11ba712d 100644 --- a/pom.xml +++ b/pom.xml @@ -271,7 +271,6 @@ jna 5.8.0 - org.mockito mockito-core @@ -290,6 +289,11 @@ 1.16.0 provided + + org.springdoc + springdoc-openapi-ui + 1.8.0 + diff --git a/src/main/java/it/gov/pagopa/cgn/portal/CGNOnboardingPortal.java b/src/main/java/it/gov/pagopa/cgn/portal/CGNOnboardingPortal.java index 76e9cd42..755ae2f6 100644 --- a/src/main/java/it/gov/pagopa/cgn/portal/CGNOnboardingPortal.java +++ b/src/main/java/it/gov/pagopa/cgn/portal/CGNOnboardingPortal.java @@ -1,7 +1,12 @@ package it.gov.pagopa.cgn.portal; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; + +import java.util.Arrays; @SpringBootApplication public class CGNOnboardingPortal { @@ -9,5 +14,13 @@ public class CGNOnboardingPortal { public static void main(String[] args) { SpringApplication.run(CGNOnboardingPortal.class, args); } - +/* + @Bean + public CommandLineRunner printBeans(ApplicationContext ctx) { + return args -> { + System.out.println("Beans registrati:"); + Arrays.stream(ctx.getBeanDefinitionNames()).sorted().forEach(System.out::println); + }; + } +*/ } \ No newline at end of file diff --git a/src/main/java/it/gov/pagopa/cgn/portal/config/OpenAPIConfig.java b/src/main/java/it/gov/pagopa/cgn/portal/config/OpenAPIConfig.java new file mode 100644 index 00000000..390c1cf4 --- /dev/null +++ b/src/main/java/it/gov/pagopa/cgn/portal/config/OpenAPIConfig.java @@ -0,0 +1,37 @@ +package it.gov.pagopa.cgn.portal.config; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import io.swagger.v3.oas.models.security.SecurityScheme.In; +import io.swagger.v3.oas.models.security.SecurityScheme.Type; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class OpenAPIConfig { + + @Value("${cgn.role.header}") + private String cgnRoleHeader; + + @Bean + public OpenAPI customOpenAPI() { + return new OpenAPI() + .info(new Info() + .title("API Documentation") + .version("1.0") + .description("Documentazione delle API con autenticazione JWT e custom header")) + .addSecurityItem(new SecurityRequirement().addList("BearerAuth").addList("CustomHeader")) + .components(new io.swagger.v3.oas.models.Components() + .addSecuritySchemes("BearerAuth", new SecurityScheme() + .type(Type.HTTP) + .scheme("bearer") + .bearerFormat("JWT")) + .addSecuritySchemes("CustomHeader", new SecurityScheme() + .type(Type.APIKEY) + .name(cgnRoleHeader) // Nome del tuo header + .in(In.HEADER))); + } +} diff --git a/src/main/java/it/gov/pagopa/cgn/portal/security/WebSecurityConfig.java b/src/main/java/it/gov/pagopa/cgn/portal/security/WebSecurityConfig.java index 1f9e17b3..a8f3dee7 100644 --- a/src/main/java/it/gov/pagopa/cgn/portal/security/WebSecurityConfig.java +++ b/src/main/java/it/gov/pagopa/cgn/portal/security/WebSecurityConfig.java @@ -64,7 +64,10 @@ protected void configure(HttpSecurity httpSecurity) .cors() .and() .authorizeRequests() - .antMatchers("/actuator/**", "/help", "/") + .antMatchers(new String[]{"/actuator/**", "/help", "/", + "/v3/api-docs/**", + "/swagger-ui/**", + "/swagger-ui.html"}) .permitAll() .anyRequest() .authenticated(); From ff73eb4ca1dee45ce192eb4ec0993fcac86fe2c0 Mon Sep 17 00:00:00 2001 From: aforcuti Date: Thu, 20 Feb 2025 16:06:38 +0100 Subject: [PATCH 2/4] Setup for run/debug during development Added guide, on properties file, for run/debug configurations Added swagger-ui Edited webSecuity, for bypass some paths only for profile dev. --- .../portal/security/WebSecurityConfig.java | 17 +++++++++++---- src/main/resources/application-dev.properties | 21 +++++++++++++++++-- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/main/java/it/gov/pagopa/cgn/portal/security/WebSecurityConfig.java b/src/main/java/it/gov/pagopa/cgn/portal/security/WebSecurityConfig.java index a8f3dee7..8cb596cd 100644 --- a/src/main/java/it/gov/pagopa/cgn/portal/security/WebSecurityConfig.java +++ b/src/main/java/it/gov/pagopa/cgn/portal/security/WebSecurityConfig.java @@ -3,6 +3,7 @@ import it.gov.pagopa.cgn.portal.config.ConfigProperties; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; @@ -15,7 +16,9 @@ import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; @Configuration @@ -24,6 +27,9 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + @Value("${spring.profiles.active:Unknown}") + private String activeProfile; + @Autowired private JwtAuthenticationEntryPoint unauthorizedHandler; @@ -64,10 +70,7 @@ protected void configure(HttpSecurity httpSecurity) .cors() .and() .authorizeRequests() - .antMatchers(new String[]{"/actuator/**", "/help", "/", - "/v3/api-docs/**", - "/swagger-ui/**", - "/swagger-ui.html"}) + .antMatchers(getAntMatchers()) .permitAll() .anyRequest() .authenticated(); @@ -77,4 +80,10 @@ protected void configure(HttpSecurity httpSecurity) httpSecurity.headers().cacheControl(); } + + private String[] getAntMatchers() { + return ("dev".equals(activeProfile) ? + List.of("/actuator/**", "/help", "/","/v3/api-docs/**","/swagger-ui/**","/swagger-ui.html") + : List.of("/actuator/**", "/help", "/")).toArray(String[]::new); + } } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 0b5e7f7d..0eb36b10 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -1,3 +1,16 @@ +######################################## +# DON'T INSERT SENSIBLE DATA HERE, FOR LOCAL RUN/DEBUG FOLLOW THIS STEPS: + +# 1 Copy this file to a folder of your convenience +# 2 On copied file, leaves only the key-value pairs of sensitive data +# 2 Run > Edit configurations > Application > CGNOnboardingPortal +# 3 Run > Edit configurations > Application > modify Options... > check on "Add VM Options" +# 4 insert in this field: -Dspring.config.additional-location=file:PATH_TO/YOUR_FOLDER/application-dev.properties +# 5 Run > Edit configurations > Application > modify Options... > check on "add dependences with provided scope to the classpath" +# INFO on spring.config.additional-location: If a key=value is present in both, external file has precedence +# for more info look at: https://docs.spring.io/spring-boot/docs/2.1.7.RELEASE/reference/html/boot-features-external-config.html +######################################## + #jpa: spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true @@ -16,8 +29,7 @@ spring.flyway.enabled=true flyway.url=${spring.datasource.url} flyway.user=${spring.datasource.username} flyway.password=${spring.datasource.password} -#launch job eyca every minute -send.discounts.to.eyca.job.cron=0 * * ? * * + eyca.job.mailto=elisa.mastrantonio@pagopa.it;carlo.quattrocchi.esterno@pagopa.it;alessandro.forcuti@dgsspa.com eyca.admin.mailto=carlo.quattrocchi.esterno@pagopa.it;alessandro.forcuti@dgsspa.com eyca.export.username=secret @@ -26,7 +38,12 @@ eyca.export.password=secret ### DEV PROPERTIES ENABLE ON NECESSITY AND REBUILD APP ## spring.quartz.autostartup=false eyca.export.enabled=false +#launch job eyca every minute +send.discounts.to.eyca.job.cron=0 * * ? * * + +#CHANGE THIS FLAG CAREFULLY, CAN BE DANGEROUS FOR EYCA DB !!! eyca.api.debug=false eyca.api.delete.debug=false + logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace logging.level.org.springframework.web=trace From a2f4a4051ada2e1639b2c708dd1ac10d9437118c Mon Sep 17 00:00:00 2001 From: aforcuti Date: Fri, 21 Feb 2025 11:18:15 +0100 Subject: [PATCH 3/4] Added profile dev --- .../java/it/gov/pagopa/cgn/portal/CGNOnboardingPortal.java | 7 ++++--- .../it/gov/pagopa/cgn/portal/config/OpenAPIConfig.java | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/it/gov/pagopa/cgn/portal/CGNOnboardingPortal.java b/src/main/java/it/gov/pagopa/cgn/portal/CGNOnboardingPortal.java index 755ae2f6..cc76fca2 100644 --- a/src/main/java/it/gov/pagopa/cgn/portal/CGNOnboardingPortal.java +++ b/src/main/java/it/gov/pagopa/cgn/portal/CGNOnboardingPortal.java @@ -5,6 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Profile; import java.util.Arrays; @@ -14,13 +15,13 @@ public class CGNOnboardingPortal { public static void main(String[] args) { SpringApplication.run(CGNOnboardingPortal.class, args); } -/* + @Bean + @Profile("dev") public CommandLineRunner printBeans(ApplicationContext ctx) { return args -> { - System.out.println("Beans registrati:"); + System.out.println("Registered beans:"); Arrays.stream(ctx.getBeanDefinitionNames()).sorted().forEach(System.out::println); }; } -*/ } \ No newline at end of file diff --git a/src/main/java/it/gov/pagopa/cgn/portal/config/OpenAPIConfig.java b/src/main/java/it/gov/pagopa/cgn/portal/config/OpenAPIConfig.java index 390c1cf4..40bbeea4 100644 --- a/src/main/java/it/gov/pagopa/cgn/portal/config/OpenAPIConfig.java +++ b/src/main/java/it/gov/pagopa/cgn/portal/config/OpenAPIConfig.java @@ -9,8 +9,10 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; @Configuration +@Profile("dev") public class OpenAPIConfig { @Value("${cgn.role.header}") From f85b9479b29b64f610c2cc133bead3949170c9d3 Mon Sep 17 00:00:00 2001 From: aforcuti Date: Fri, 21 Feb 2025 11:25:39 +0100 Subject: [PATCH 4/4] Update application-dev.properties --- src/main/resources/application-dev.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 0eb36b10..1d38914b 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -1,4 +1,4 @@ -######################################## +######################################## # DON'T INSERT SENSIBLE DATA HERE, FOR LOCAL RUN/DEBUG FOLLOW THIS STEPS: # 1 Copy this file to a folder of your convenience