diff --git a/spring-reactive-modules/spring-reactive-oauth/pom.xml b/spring-reactive-modules/spring-reactive-oauth/pom.xml index 9d2dbf6126..d4699acd6d 100644 --- a/spring-reactive-modules/spring-reactive-oauth/pom.xml +++ b/spring-reactive-modules/spring-reactive-oauth/pom.xml @@ -11,9 +11,10 @@ WebFlux and Spring Security OAuth - com.baeldung.spring.reactive - spring-reactive-modules - 1.0.0-SNAPSHOT + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -62,4 +63,8 @@ + + com.baeldung.reactive.oauth.Spring5ReactiveOauthApplication + + \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/reactive/oauth/SecurityConfig.java b/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/reactive/oauth/SecurityConfig.java index 2fa1dd9380..c2069d3cdb 100644 --- a/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/reactive/oauth/SecurityConfig.java +++ b/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/reactive/oauth/SecurityConfig.java @@ -1,6 +1,7 @@ package com.baeldung.reactive.oauth; import org.springframework.context.annotation.Bean; +import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; import org.springframework.security.config.web.server.ServerHttpSecurity; import org.springframework.security.web.server.SecurityWebFilterChain; @@ -10,10 +11,11 @@ public class SecurityConfig { @Bean public SecurityWebFilterChain configure(ServerHttpSecurity http) throws Exception { - return http.authorizeExchange() + return http.authorizeExchange(auth -> auth .pathMatchers("/about").permitAll() - .anyExchange().authenticated() - .and().oauth2Login() - .and().build(); + .anyExchange().authenticated()) + .oauth2Login(Customizer.withDefaults()) + .build(); } + } diff --git a/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/reactive/oauth/Spring5ReactiveOauthApplication.java b/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/reactive/oauth/Spring5ReactiveOauthApplication.java index b95517200e..7fe82404be 100644 --- a/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/reactive/oauth/Spring5ReactiveOauthApplication.java +++ b/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/reactive/oauth/Spring5ReactiveOauthApplication.java @@ -4,9 +4,12 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.PropertySource; +import org.springframework.security.oauth2.client.registration.ClientRegistration; +import org.springframework.security.oauth2.client.registration.InMemoryReactiveClientRegistrationRepository; import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository; import org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction; import org.springframework.security.oauth2.client.web.server.ServerOAuth2AuthorizedClientRepository; +import org.springframework.security.oauth2.core.AuthorizationGrantType; import org.springframework.web.reactive.function.client.WebClient; @PropertySource("classpath:default-application.yml") @@ -24,4 +27,13 @@ public class Spring5ReactiveOauthApplication { .filter(filter) .build(); } + + @Bean + public ReactiveClientRegistrationRepository clientRegistrations() { + ClientRegistration registration = ClientRegistration.withRegistrationId("bael").authorizationGrantType( + AuthorizationGrantType.CLIENT_CREDENTIALS).clientId("bael").tokenUri("default").build(); + + return new InMemoryReactiveClientRegistrationRepository(registration); + + } } diff --git a/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/configuration/WebSecurityConfig.java b/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/configuration/WebSecurityConfig.java index 4271ae96cf..325c322a73 100644 --- a/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/configuration/WebSecurityConfig.java +++ b/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/configuration/WebSecurityConfig.java @@ -2,6 +2,7 @@ package com.baeldung.webclient.authorizationcodeclient.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.Customizer; import org.springframework.security.config.web.server.ServerHttpSecurity; import org.springframework.security.web.server.SecurityWebFilterChain; @@ -9,13 +10,9 @@ import org.springframework.security.web.server.SecurityWebFilterChain; public class WebSecurityConfig { @Bean public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { - http.authorizeExchange() - .anyExchange() - .authenticated() - .and() - .oauth2Client() - .and() - .formLogin(); + http.authorizeExchange(s-> s.anyExchange().authenticated()) + .oauth2Client(Customizer.withDefaults()) + .formLogin(Customizer.withDefaults()); return http.build(); } diff --git a/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/configuration/WebSecurityConfig.java b/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/configuration/WebSecurityConfig.java index f45fc09222..46e3828ec2 100644 --- a/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/configuration/WebSecurityConfig.java +++ b/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/configuration/WebSecurityConfig.java @@ -2,6 +2,7 @@ package com.baeldung.webclient.authorizationcodelogin.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.Customizer; import org.springframework.security.config.web.server.ServerHttpSecurity; import org.springframework.security.web.server.SecurityWebFilterChain; @@ -9,11 +10,8 @@ import org.springframework.security.web.server.SecurityWebFilterChain; public class WebSecurityConfig { @Bean public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { - http.authorizeExchange() - .anyExchange() - .authenticated() - .and() - .oauth2Login(); + http.authorizeExchange(s-> s.anyExchange().authenticated()) + .oauth2Login(Customizer.withDefaults()); return http.build(); } diff --git a/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/configuration/WebClientConfig.java b/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/configuration/WebClientConfig.java index 8ffc92b4cd..1bf9ddd5be 100644 --- a/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/configuration/WebClientConfig.java +++ b/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/configuration/WebClientConfig.java @@ -1,22 +1,60 @@ package com.baeldung.webclient.clientcredentials.configuration; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.oauth2.client.AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager; +import org.springframework.security.oauth2.client.InMemoryReactiveOAuth2AuthorizedClientService; +import org.springframework.security.oauth2.client.ReactiveOAuth2AuthorizedClientProvider; +import org.springframework.security.oauth2.client.ReactiveOAuth2AuthorizedClientProviderBuilder; +import org.springframework.security.oauth2.client.registration.ClientRegistration; +import org.springframework.security.oauth2.client.registration.InMemoryReactiveClientRegistrationRepository; import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository; import org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction; -import org.springframework.security.oauth2.client.web.server.UnAuthenticatedServerOAuth2AuthorizedClientRepository; +import org.springframework.security.oauth2.core.AuthorizationGrantType; import org.springframework.web.reactive.function.client.WebClient; @Configuration public class WebClientConfig { @Bean - WebClient webClient(ReactiveClientRegistrationRepository clientRegistrations) { - ServerOAuth2AuthorizedClientExchangeFilterFunction oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations, new UnAuthenticatedServerOAuth2AuthorizedClientRepository()); - oauth.setDefaultClientRegistrationId("bael"); - return WebClient.builder() - .filter(oauth) + ReactiveClientRegistrationRepository clientRegistrations( + @Value("${spring.security.oauth2.client.provider.bael.token-uri}") String token_uri, + @Value("${spring.security.oauth2.client.registration.bael.client-id}") String client_id, + @Value("${spring.security.oauth2.client.registration.bael.client-secret}") String client_secret, + @Value("${spring.security.oauth2.client.registration.bael.authorization-grant-type}") String authorizationGrantType + + ) { + ClientRegistration registration = ClientRegistration + .withRegistrationId("keycloak") + .tokenUri(token_uri) + .clientId(client_id) + .clientSecret(client_secret) + .authorizationGrantType(new AuthorizationGrantType(authorizationGrantType)) .build(); + return new InMemoryReactiveClientRegistrationRepository(registration); + } + @Bean + public AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager authorizedClientManager( + ReactiveClientRegistrationRepository clientRegistrationRepository) { + InMemoryReactiveOAuth2AuthorizedClientService clientService = + new InMemoryReactiveOAuth2AuthorizedClientService(clientRegistrationRepository); + ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider = + ReactiveOAuth2AuthorizedClientProviderBuilder.builder().clientCredentials().build(); + AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager authorizedClientManager = + new AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager( + clientRegistrationRepository, clientService); + authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider); + return authorizedClientManager; } + @Bean + WebClient webClient(AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager auth2AuthorizedClientManager) { + ServerOAuth2AuthorizedClientExchangeFilterFunction oauth2Client = + new ServerOAuth2AuthorizedClientExchangeFilterFunction(auth2AuthorizedClientManager); + oauth2Client.setDefaultClientRegistrationId("bael"); + return WebClient.builder() + .filter(oauth2Client) + .build(); + } } diff --git a/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/configure/WebClientConfig.java b/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/configure/WebClientConfig.java index 51fc60821a..33493be61d 100644 --- a/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/configure/WebClientConfig.java +++ b/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/configure/WebClientConfig.java @@ -11,6 +11,6 @@ public class WebClientConfig { public WebClient configureWebClient() { return WebClient.builder() .build(); - }; + } } diff --git a/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/configure/WebSecurityConfig.java b/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/configure/WebSecurityConfig.java index 1753681db8..0aa38d2a12 100644 --- a/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/configure/WebSecurityConfig.java +++ b/spring-reactive-modules/spring-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/configure/WebSecurityConfig.java @@ -9,9 +9,7 @@ import org.springframework.security.web.server.SecurityWebFilterChain; public class WebSecurityConfig { @Bean public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { - http.authorizeExchange() - .anyExchange() - .permitAll(); + http.authorizeExchange(s -> s.anyExchange().permitAll()); return http.build(); } } diff --git a/spring-reactive-modules/spring-reactive-oauth/src/test/java/com/baeldung/reactive/oauth/Spring5ReactiveOauthIntegrationTest.java b/spring-reactive-modules/spring-reactive-oauth/src/test/java/com/baeldung/reactive/oauth/Spring5ReactiveOauthIntegrationTest.java index db545d63de..fc2b540f4d 100644 --- a/spring-reactive-modules/spring-reactive-oauth/src/test/java/com/baeldung/reactive/oauth/Spring5ReactiveOauthIntegrationTest.java +++ b/spring-reactive-modules/spring-reactive-oauth/src/test/java/com/baeldung/reactive/oauth/Spring5ReactiveOauthIntegrationTest.java @@ -1,12 +1,13 @@ package com.baeldung.reactive.oauth; +import com.baeldung.webclient.clientcredentials.configuration.WebClientConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) -@SpringBootTest +@SpringBootTest(classes = WebClientConfig.class) public class Spring5ReactiveOauthIntegrationTest { @Test