Skip to content

Commit 9512670

Browse files
committed
Refactor application configuration to support reactive web and update dependencies #deploy-test-dolly-search-service
1 parent bc08cb8 commit 9512670

File tree

9 files changed

+74
-73
lines changed

9 files changed

+74
-73
lines changed

apps/dolly-search-service/build.gradle

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ dependencies {
1313
implementation "no.nav.testnav.libs:data-transfer-search-objects"
1414
implementation "no.nav.testnav.libs:reactive-core"
1515
implementation "no.nav.testnav.libs:security-core"
16-
implementation "no.nav.testnav.libs:servlet-core"
17-
implementation "no.nav.testnav.libs:servlet-security"
16+
implementation "no.nav.testnav.libs:reactive-security"
1817
implementation "no.nav.testnav.libs:testing"
1918

2019
implementation "org.opensearch.client:spring-data-opensearch:$versions.opensearch"
@@ -29,5 +28,6 @@ dependencies {
2928

3029
implementation "ma.glasnost.orika:orika-core:$versions.orika"
3130

32-
implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:$versions.springdoc"
31+
implementation "io.swagger.core.v3:swagger-annotations-jakarta:$versions.swagger"
32+
implementation "org.springdoc:springdoc-openapi-starter-webflux-ui:$versions.springdoc"
3333
}

apps/dolly-search-service/settings.gradle

+1-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ includeBuild "../../plugins/java"
99
includeBuild '../../libs/data-transfer-search-objects'
1010
includeBuild '../../libs/reactive-core'
1111
includeBuild '../../libs/security-core'
12-
includeBuild '../../libs/servlet-core'
13-
includeBuild '../../libs/servlet-security'
12+
includeBuild '../../libs/reactive-security'
1413
includeBuild '../../libs/testing'
1514

1615
develocity {

apps/dolly-search-service/src/main/java/no/nav/testnav/dollysearchservice/DollySearchServiceApplicationStarter.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
import no.nav.dolly.libs.nais.NaisEnvironmentApplicationContextInitializer;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
55
import org.springframework.boot.builder.SpringApplicationBuilder;
6+
import org.springframework.web.reactive.config.EnableWebFlux;
67

8+
@EnableWebFlux
79
@SpringBootApplication
8-
public class
9-
DollySearchServiceApplicationStarter {
10+
public class DollySearchServiceApplicationStarter {
1011
public static void main(String[] args) {
1112

1213
new SpringApplicationBuilder(DollySearchServiceApplicationStarter.class)

apps/dolly-search-service/src/main/java/no/nav/testnav/dollysearchservice/config/ApplicationConfig.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package no.nav.testnav.dollysearchservice.config;
22

3-
import no.nav.testnav.libs.servletcore.config.ApplicationCoreConfig;
4-
import no.nav.testnav.libs.servletsecurity.jwt.SecureOAuth2ServerToServerAutoConfiguration;
3+
import no.nav.testnav.libs.reactivecore.config.CoreConfig;
4+
import no.nav.testnav.libs.reactivesecurity.config.SecureOAuth2ServerToServerConfiguration;
55
import org.springframework.context.annotation.Configuration;
66
import org.springframework.context.annotation.Import;
77

88
@Configuration
99
@Import({
10-
ApplicationCoreConfig.class,
11-
SecureOAuth2ServerToServerAutoConfiguration.class
10+
CoreConfig.class,
11+
SecureOAuth2ServerToServerConfiguration.class
1212
})
1313
public class ApplicationConfig {
1414

apps/dolly-search-service/src/main/java/no/nav/testnav/dollysearchservice/config/OpenApiConfig.java

+24-28
Original file line numberDiff line numberDiff line change
@@ -7,43 +7,31 @@
77
import io.swagger.v3.oas.models.info.License;
88
import io.swagger.v3.oas.models.security.SecurityRequirement;
99
import io.swagger.v3.oas.models.security.SecurityScheme;
10+
import no.nav.testnav.libs.reactivecore.config.ApplicationProperties;
1011
import org.springframework.context.annotation.Bean;
1112
import org.springframework.context.annotation.Configuration;
12-
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
13-
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
13+
import org.springframework.web.server.ServerWebExchange;
14+
import org.springframework.web.server.WebFilter;
15+
import org.springframework.web.server.WebFilterChain;
16+
import reactor.core.publisher.Mono;
1417

1518
import java.util.Arrays;
1619

17-
import no.nav.testnav.libs.securitycore.config.UserConstant;
18-
import no.nav.testnav.libs.servletcore.config.ApplicationProperties;
19-
2020
@Configuration
21-
public class OpenApiConfig implements WebMvcConfigurer {
21+
public class OpenApiConfig implements WebFilter {
2222

2323
@Bean
2424
public OpenAPI openApi(ApplicationProperties applicationProperties) {
2525
return new OpenAPI()
26-
.components(new Components()
27-
.addSecuritySchemes("bearer-jwt", new SecurityScheme()
28-
.type(SecurityScheme.Type.HTTP)
29-
.scheme("bearer")
30-
.bearerFormat("JWT")
31-
.in(SecurityScheme.In.HEADER)
32-
.name("Authorization")
33-
.description("Trenger ikke \"Bearer \" foran")
34-
)
35-
.addSecuritySchemes("user-jwt", new SecurityScheme()
36-
.type(SecurityScheme.Type.APIKEY)
37-
.scheme("bearer")
38-
.bearerFormat("JWT")
39-
.in(SecurityScheme.In.HEADER)
40-
.name(UserConstant.USER_HEADER_JWT)
41-
))
26+
.components(new Components().addSecuritySchemes("bearer-jwt", new SecurityScheme()
27+
.type(SecurityScheme.Type.HTTP)
28+
.scheme("bearer")
29+
.bearerFormat("JWT")
30+
.in(SecurityScheme.In.HEADER)
31+
.name("Authorization")
32+
))
4233
.addSecurityItem(
43-
new SecurityRequirement()
44-
.addList("bearer-jwt", Arrays.asList("read", "write"))
45-
.addList("user-jwt", Arrays.asList("read", "write"))
46-
)
34+
new SecurityRequirement().addList("bearer-jwt", Arrays.asList("read", "write")))
4735
.info(new Info()
4836
.title(applicationProperties.getName())
4937
.version(applicationProperties.getVersion())
@@ -62,7 +50,15 @@ public OpenAPI openApi(ApplicationProperties applicationProperties) {
6250
}
6351

6452
@Override
65-
public void addViewControllers(ViewControllerRegistry registry) {
66-
registry.addViewController("/swagger").setViewName("redirect:/swagger-ui.html");
53+
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
54+
if (exchange.getRequest().getURI().getPath().equals("/swagger")) {
55+
return chain
56+
.filter(exchange.mutate()
57+
.request(exchange.getRequest()
58+
.mutate().path("/swagger-ui.html").build())
59+
.build());
60+
}
61+
62+
return chain.filter(exchange);
6763
}
6864
}
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,41 @@
11
package no.nav.testnav.dollysearchservice.config;
22

3+
import lombok.RequiredArgsConstructor;
4+
import no.nav.testnav.libs.reactivesecurity.manager.JwtReactiveAuthenticationManager;
35
import org.springframework.context.annotation.Bean;
46
import org.springframework.context.annotation.Configuration;
57
import org.springframework.context.annotation.Profile;
6-
import org.springframework.security.config.Customizer;
7-
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
8-
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
9-
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
10-
import org.springframework.security.config.http.SessionCreationPolicy;
11-
import org.springframework.security.web.SecurityFilterChain;
8+
import org.springframework.security.config.annotation.method.configuration.EnableReactiveMethodSecurity;
9+
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
10+
import org.springframework.security.config.web.server.ServerHttpSecurity;
11+
import org.springframework.security.web.server.SecurityWebFilterChain;
1212

13-
@EnableWebSecurity
13+
@EnableWebFluxSecurity
14+
@EnableReactiveMethodSecurity
1415
@Configuration
15-
@Profile({ "prod", "dev", "local" })
16+
@Profile({"prod", "dev", "local"})
17+
@RequiredArgsConstructor
1618
public class SecurityConfig {
1719

18-
@Bean
19-
public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
20-
21-
httpSecurity.sessionManagement(sessionConfig -> sessionConfig.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
22-
.csrf(AbstractHttpConfigurer::disable)
23-
.authorizeHttpRequests(authorizeConfig -> authorizeConfig.requestMatchers(
24-
"/internal/**",
25-
"/webjars/**",
26-
"/swagger-resources/**",
27-
"/v3/api-docs/**",
28-
"/swagger-ui/**",
29-
"/swagger",
30-
"/error",
31-
"/swagger-ui.html"
32-
).permitAll().requestMatchers("/api/**").fullyAuthenticated())
33-
.oauth2ResourceServer(oauth2RSConfig -> oauth2RSConfig.jwt(Customizer.withDefaults()));
20+
private final JwtReactiveAuthenticationManager jwtReactiveAuthenticationManager;
3421

35-
return httpSecurity.build();
22+
@Bean
23+
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity httpSecurity) {
24+
return httpSecurity
25+
.csrf(ServerHttpSecurity.CsrfSpec::disable)
26+
.authorizeExchange(authorizeConfig -> authorizeConfig.pathMatchers(
27+
"/internal/**",
28+
"/webjars/**",
29+
"/v3/api-docs/**",
30+
"/swagger-ui/**",
31+
"/swagger",
32+
"/error",
33+
"/swagger-ui.html"
34+
).permitAll()
35+
.anyExchange()
36+
.authenticated())
37+
.oauth2ResourceServer(oauth2RSConfig -> oauth2RSConfig.jwt(jwtSpec -> jwtSpec.authenticationManager(jwtReactiveAuthenticationManager)))
38+
.build();
3639
}
3740
}
3841

apps/dolly-search-service/src/main/java/no/nav/testnav/dollysearchservice/consumer/PdlProxyConsumer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
import no.nav.testnav.dollysearchservice.dto.SearchRequest;
1010
import no.nav.testnav.dollysearchservice.dto.SearchResponse;
1111
import no.nav.testnav.dollysearchservice.dto.TagsOpprettingResponse;
12+
import no.nav.testnav.libs.reactivesecurity.exchange.TokenExchange;
1213
import no.nav.testnav.libs.securitycore.domain.ServerProperties;
13-
import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange;
1414
import org.springframework.stereotype.Service;
1515
import org.springframework.web.reactive.function.client.WebClient;
1616
import reactor.core.publisher.Flux;

apps/dolly-search-service/src/main/java/no/nav/testnav/dollysearchservice/service/TagsService.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
@RequiredArgsConstructor
1919
public class TagsService {
2020

21-
private static final int BOLK_SIZE = 100;
21+
private static final int BOLK_SIZE = 10;
2222

2323
private final BestillingQueryService bestillingQueryService;
2424
private final PdlProxyConsumer pdlProxyConsumer;
@@ -37,11 +37,11 @@ public Mono<String> setDollyTagAlleTestnorgeIdenter() {
3737
l1.addAll(l2);
3838
return l1;
3939
})
40-
// .doOnNext(tags -> log.info("Identer som mangler Dolly-tags: {}", String.join(", ", tags)))
41-
// .filter(tags -> !tags.isEmpty())
42-
// .flatMap(pdlProxyConsumer::setTags)
43-
// .filter(response -> response.getStatus().is2xxSuccessful())
44-
// .map(TagsOpprettingResponse::getIdenter)
40+
.doOnNext(tags -> log.info("Identer som mangler Dolly-tags: {}", String.join(", ", tags)))
41+
.filter(tags -> !tags.isEmpty())
42+
.flatMap(pdlProxyConsumer::setTags)
43+
.filter(response -> response.getStatus().is2xxSuccessful())
44+
.map(TagsOpprettingResponse::getIdenter)
4545
.map(resultat -> "Følgende identer mangler DOLLY-tag: %s".formatted(String.join(", ", resultat)))
4646
.switchIfEmpty(Mono.just("Fant ingen personer som mangler Dolly-tag"));
4747
}

apps/dolly-search-service/src/main/resources/application.yml

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ spring:
1010
aad:
1111
issuer-uri: ${AAD_ISSUER_URI}/v2.0
1212
jwk-set-uri: ${AAD_ISSUER_URI}/discovery/v2.0/keys
13-
accepted-audience: ${AZURE_APP_CLIENT_ID}, api:// ${AZURE_APP_CLIENT_ID}
13+
accepted-audience: ${AZURE_APP_CLIENT_ID}, api:// ${AZURE_APP_CLIENT_ID}
1414
tokenx:
15-
issuer-uri: ${TOKEN_X_ISSUER}
15+
issuer-uri: ${TOKEN_X_ISSUER}
1616
jwk-set-uri: ${TOKEN_X_JWKS_URI}
1717
accepted-audience: ${TOKEN_X_CLIENT_ID}
18+
main:
19+
web-application-type: reactive
1820

1921
springdoc:
2022
swagger-ui:

0 commit comments

Comments
 (0)