From 922d50fad1f5a39a8c3051aea120bde54b23b181 Mon Sep 17 00:00:00 2001 From: Shili Chen Date: Thu, 27 Jul 2023 10:50:12 +0800 Subject: [PATCH 1/4] Update aad default configuration condition --- .../AadResourceServerConfiguration.java | 3 +- .../AadWebApplicationConfiguration.java | 3 +- .../AadResourceServerConfigurationTests.java | 104 ++++++++++++++++++ .../AadWebApplicationConfigurationTests.java | 101 +++++++++++++++++ 4 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfigurationTests.java create mode 100644 sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfigurationTests.java diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfiguration.java index d4979f464c1f..cdbe79790fef 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfiguration.java @@ -11,6 +11,7 @@ import com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthorizationServerEndpoints; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.security.ConditionalOnDefaultWebSecurity; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; @@ -103,7 +104,7 @@ public List> createDefaultValidator(AadAuthenticationP */ @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) - @ConditionalOnMissingBean(WebSecurityConfigurerAdapter.class) + @ConditionalOnDefaultWebSecurity @ConditionalOnExpression("!'${spring.cloud.azure.active-directory.application-type}'.equalsIgnoreCase('web_application_and_resource_server')") public static class DefaultAadResourceServerWebSecurityConfigurerAdapter extends AadResourceServerWebSecurityConfigurerAdapter { diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfiguration.java index 93dac2ac4bd0..f22a2022ac01 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfiguration.java @@ -9,6 +9,7 @@ import com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthenticationProperties; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.security.ConditionalOnDefaultWebSecurity; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; @@ -57,7 +58,7 @@ public OAuth2UserService oidcUserService(AadAuthentic */ @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) - @ConditionalOnMissingBean(WebSecurityConfigurerAdapter.class) + @ConditionalOnDefaultWebSecurity @ConditionalOnExpression("!'${spring.cloud.azure.active-directory.application-type}'.equalsIgnoreCase('web_application_and_resource_server')") public static class DefaultAadWebSecurityConfigurerAdapter extends AadWebSecurityConfigurerAdapter { diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfigurationTests.java new file mode 100644 index 000000000000..975f48abe77e --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfigurationTests.java @@ -0,0 +1,104 @@ +package com.azure.spring.cloud.autoconfigure.aad.configuration; + +import com.azure.spring.cloud.autoconfigure.aad.AadAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.aad.AadResourceServerWebSecurityConfigurerAdapter; +import com.azure.spring.cloud.autoconfigure.context.AzureGlobalPropertiesAutoConfiguration; +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration; +import org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener; +import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration; +import org.springframework.boot.context.annotation.Configurations; +import org.springframework.boot.logging.LogLevel; +import org.springframework.boot.test.context.runner.WebApplicationContextRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +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.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer; +import org.springframework.security.web.SecurityFilterChain; + +import static com.azure.spring.cloud.autoconfigure.aad.implementation.WebApplicationContextRunnerUtils.resourceServerRunner; +import static org.assertj.core.api.Assertions.assertThat; + +public class AadResourceServerConfigurationTests { + @Test + void useDefaultWebSecurityConfigurerAdapter() { + resourceServerRunner() + .withPropertyValues( + "spring.cloud.azure.active-directory.enabled=true", + "spring.cloud.azure.active-directory.credential.client-id=fake-client-id" + ) + .run(context -> { + assertThat(context).hasSingleBean(AadResourceServerWebSecurityConfigurerAdapter.class); + assertThat(context).hasSingleBean(AadResourceServerConfiguration.DefaultAadResourceServerWebSecurityConfigurerAdapter.class); + } + ); + } + + @Test + void useCustomWebSecurityConfigurerAdapter() { + resourceServerRunner() + .withUserConfiguration(TestAadResourceServerWebSecurityConfigurerAdapter.class) + .withPropertyValues( + "spring.cloud.azure.active-directory.enabled=true", + "spring.cloud.azure.active-directory.credential.client-id=fake-client-id" + ) + .run(context -> { + assertThat(context).hasSingleBean(WebSecurityConfigurerAdapter.class); + assertThat(context).doesNotHaveBean(AadResourceServerConfiguration.DefaultAadResourceServerWebSecurityConfigurerAdapter.class); + assertThat(context).hasSingleBean(TestAadResourceServerWebSecurityConfigurerAdapter.class); + } + ); + } + + @Test + void useCustomSecurityFilterChain() { + new WebApplicationContextRunner() + .withConfiguration(AutoConfigurations.of( + HttpMessageConvertersAutoConfiguration.class, + RestTemplateAutoConfiguration.class)) + .withUserConfiguration(AzureGlobalPropertiesAutoConfiguration.class, + TestSecurityFilterChain.class, + AadAutoConfiguration.class) + .withInitializer(new ConditionEvaluationReportLoggingListener(LogLevel.INFO)) + .withPropertyValues( + "spring.cloud.azure.active-directory.enabled=true", + "spring.cloud.azure.active-directory.credential.client-id=fake-client-id" + ) + .run(context -> { + assertThat(context).hasSingleBean(SecurityFilterChain.class); + assertThat(context).doesNotHaveBean(WebSecurityConfigurerAdapter.class); + assertThat(context).doesNotHaveBean(AadResourceServerConfiguration.DefaultAadResourceServerWebSecurityConfigurerAdapter.class); + assertThat(context).hasSingleBean(TestSecurityFilterChain.class); + } + ); + } + + @EnableWebSecurity + static class TestAadResourceServerWebSecurityConfigurerAdapter extends + AadResourceServerWebSecurityConfigurerAdapter { + + /** + * Configure the default Resource Server for Azure AD. + * + * @param http the {@link HttpSecurity} to use + * @throws Exception Configuration failed + */ + @Override + protected void configure(HttpSecurity http) throws Exception { + super.configure(http); + } + } + + @EnableWebSecurity + static class TestSecurityFilterChain { + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + return http.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt).build(); + } + } +} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfigurationTests.java new file mode 100644 index 000000000000..173b16f4bd9b --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfigurationTests.java @@ -0,0 +1,101 @@ +package com.azure.spring.cloud.autoconfigure.aad.configuration; + +import com.azure.spring.cloud.autoconfigure.aad.AadAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.aad.AadWebSecurityConfigurerAdapter; +import com.azure.spring.cloud.autoconfigure.context.AzureGlobalPropertiesAutoConfiguration; +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration; +import org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener; +import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration; +import org.springframework.boot.logging.LogLevel; +import org.springframework.boot.test.context.runner.WebApplicationContextRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.Customizer; +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; + +import static com.azure.spring.cloud.autoconfigure.aad.implementation.WebApplicationContextRunnerUtils.webApplicationContextRunner; +import static org.assertj.core.api.Assertions.assertThat; + +public class AadWebApplicationConfigurationTests { + @Test + void useDefaultWebSecurityConfigurerAdapter() { + webApplicationContextRunner() + .withPropertyValues( + "spring.cloud.azure.active-directory.enabled=true", + "spring.cloud.azure.active-directory.credential.client-id=fake-client-id" + ) + .run(context -> { + assertThat(context).hasSingleBean(AadWebSecurityConfigurerAdapter.class); + assertThat(context).hasSingleBean(AadWebApplicationConfiguration.DefaultAadWebSecurityConfigurerAdapter.class); + } + ); + } + + @Test + void useCustomWebSecurityConfigurerAdapter() { + webApplicationContextRunner() + .withUserConfiguration(TestAadWebSecurityConfigurerAdapter.class) + .withPropertyValues( + "spring.cloud.azure.active-directory.enabled=true", + "spring.cloud.azure.active-directory.credential.client-id=fake-client-id" + ) + .run(context -> { + assertThat(context).hasSingleBean(WebSecurityConfigurerAdapter.class); + assertThat(context).doesNotHaveBean(AadWebApplicationConfiguration.DefaultAadWebSecurityConfigurerAdapter.class); + assertThat(context).hasSingleBean(TestAadWebSecurityConfigurerAdapter.class); + } + ); + } + + @Test + void useCustomSecurityFilterChain() { + new WebApplicationContextRunner() + .withConfiguration(AutoConfigurations.of( + HttpMessageConvertersAutoConfiguration.class, + RestTemplateAutoConfiguration.class)) + .withUserConfiguration(AzureGlobalPropertiesAutoConfiguration.class, + AadResourceServerConfigurationTests.TestSecurityFilterChain.class, + AadAutoConfiguration.class) + .withInitializer(new ConditionEvaluationReportLoggingListener(LogLevel.INFO)) + .withPropertyValues( + "spring.cloud.azure.active-directory.enabled=true", + "spring.cloud.azure.active-directory.credential.client-id=fake-client-id" + ) + .run(context -> { + assertThat(context).hasSingleBean(SecurityFilterChain.class); + assertThat(context).doesNotHaveBean(WebSecurityConfigurerAdapter.class); + assertThat(context).doesNotHaveBean(AadWebApplicationConfiguration.DefaultAadWebSecurityConfigurerAdapter.class); + assertThat(context).hasSingleBean(AadResourceServerConfigurationTests.TestSecurityFilterChain.class); + } + ); + } + + @EnableWebSecurity + static class TestAadWebSecurityConfigurerAdapter extends + AadWebSecurityConfigurerAdapter { + + /** + * Configure the default Resource Server for Azure AD. + * + * @param http the {@link HttpSecurity} to use + * @throws Exception Configuration failed + */ + @Override + protected void configure(HttpSecurity http) throws Exception { + super.configure(http); + } + } + + @EnableWebSecurity + static class TestSecurityFilterChain { + + @Bean + public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception { + return http.oauth2Login(Customizer.withDefaults()).authorizeRequests(request -> request.anyRequest().authenticated()).build(); + } + } +} From c29c3f827a82d9edc9c2a16dc175675fc051a332 Mon Sep 17 00:00:00 2001 From: Shili Chen Date: Thu, 27 Jul 2023 12:55:42 +0800 Subject: [PATCH 2/4] Fix code smell and update changelog --- sdk/spring/CHANGELOG.md | 1 + .../AadResourceServerConfiguration.java | 1 - .../AadWebApplicationConfiguration.java | 1 - .../AadResourceServerConfigurationTests.java | 49 +++++++------------ .../AadWebApplicationConfigurationTests.java | 45 +++++++---------- 5 files changed, 38 insertions(+), 59 deletions(-) diff --git a/sdk/spring/CHANGELOG.md b/sdk/spring/CHANGELOG.md index ef1c71526c0d..486d2f6e41dc 100644 --- a/sdk/spring/CHANGELOG.md +++ b/sdk/spring/CHANGELOG.md @@ -9,6 +9,7 @@ This section includes changes in `spring-cloud-azure-autoconfigure` module. #### Bugs Fixed - Fix the issue that `AzureMessagingListenerAutoConfiguration` not included in spring.factories [#34690](https://github.com/Azure/azure-sdk-for-java/issues/34690), [#35716](https://github.com/Azure/azure-sdk-for-java/pull/35716). +- Fix AAD default configuration condition is not perfect [#36124](https://github.com/Azure/azure-sdk-for-java/pull/36124). ## 4.9.0 (2023-06-29) - This release is compatible with Spring Boot 2.5.0-2.5.15, 2.6.0-2.6.15, 2.7.0-2.7.11. (Note: 2.5.x (x>15), 2.6.y (y>15) and 2.7.z (z>11) should be supported, but they aren't tested with this release.) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfiguration.java index cdbe79790fef..b6715fcf49b4 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfiguration.java @@ -19,7 +19,6 @@ import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; 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.oauth2.core.DelegatingOAuth2TokenValidator; import org.springframework.security.oauth2.core.OAuth2TokenValidator; import org.springframework.security.oauth2.jwt.Jwt; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfiguration.java index f22a2022ac01..f56bd4438355 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfiguration.java @@ -17,7 +17,6 @@ import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; 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.oauth2.client.oidc.userinfo.OidcUserRequest; import org.springframework.security.oauth2.client.userinfo.OAuth2UserService; import org.springframework.security.oauth2.core.oidc.user.OidcUser; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfigurationTests.java index 975f48abe77e..1e646951d278 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfigurationTests.java @@ -1,3 +1,6 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + package com.azure.spring.cloud.autoconfigure.aad.configuration; import com.azure.spring.cloud.autoconfigure.aad.AadAutoConfiguration; @@ -8,12 +11,9 @@ import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration; import org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener; import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration; -import org.springframework.boot.context.annotation.Configurations; import org.springframework.boot.logging.LogLevel; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; import org.springframework.context.annotation.Bean; -import org.springframework.security.config.Customizer; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; 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; @@ -27,31 +27,27 @@ public class AadResourceServerConfigurationTests { @Test void useDefaultWebSecurityConfigurerAdapter() { resourceServerRunner() - .withPropertyValues( - "spring.cloud.azure.active-directory.enabled=true", + .withPropertyValues("spring.cloud.azure.active-directory.enabled=true", "spring.cloud.azure.active-directory.credential.client-id=fake-client-id" ) .run(context -> { - assertThat(context).hasSingleBean(AadResourceServerWebSecurityConfigurerAdapter.class); - assertThat(context).hasSingleBean(AadResourceServerConfiguration.DefaultAadResourceServerWebSecurityConfigurerAdapter.class); - } - ); + assertThat(context).hasSingleBean(AadResourceServerWebSecurityConfigurerAdapter.class); + assertThat(context).hasSingleBean(AadResourceServerConfiguration.DefaultAadResourceServerWebSecurityConfigurerAdapter.class); + }); } @Test void useCustomWebSecurityConfigurerAdapter() { resourceServerRunner() .withUserConfiguration(TestAadResourceServerWebSecurityConfigurerAdapter.class) - .withPropertyValues( - "spring.cloud.azure.active-directory.enabled=true", + .withPropertyValues("spring.cloud.azure.active-directory.enabled=true", "spring.cloud.azure.active-directory.credential.client-id=fake-client-id" ) .run(context -> { - assertThat(context).hasSingleBean(WebSecurityConfigurerAdapter.class); - assertThat(context).doesNotHaveBean(AadResourceServerConfiguration.DefaultAadResourceServerWebSecurityConfigurerAdapter.class); - assertThat(context).hasSingleBean(TestAadResourceServerWebSecurityConfigurerAdapter.class); - } - ); + assertThat(context).hasSingleBean(WebSecurityConfigurerAdapter.class); + assertThat(context).doesNotHaveBean(AadResourceServerConfiguration.DefaultAadResourceServerWebSecurityConfigurerAdapter.class); + assertThat(context).hasSingleBean(TestAadResourceServerWebSecurityConfigurerAdapter.class); + }); } @Test @@ -64,29 +60,22 @@ void useCustomSecurityFilterChain() { TestSecurityFilterChain.class, AadAutoConfiguration.class) .withInitializer(new ConditionEvaluationReportLoggingListener(LogLevel.INFO)) - .withPropertyValues( - "spring.cloud.azure.active-directory.enabled=true", + .withPropertyValues("spring.cloud.azure.active-directory.enabled=true", "spring.cloud.azure.active-directory.credential.client-id=fake-client-id" ) .run(context -> { - assertThat(context).hasSingleBean(SecurityFilterChain.class); - assertThat(context).doesNotHaveBean(WebSecurityConfigurerAdapter.class); - assertThat(context).doesNotHaveBean(AadResourceServerConfiguration.DefaultAadResourceServerWebSecurityConfigurerAdapter.class); - assertThat(context).hasSingleBean(TestSecurityFilterChain.class); - } - ); + assertThat(context).hasSingleBean(SecurityFilterChain.class); + assertThat(context).doesNotHaveBean(WebSecurityConfigurerAdapter.class); + assertThat(context).doesNotHaveBean(AadResourceServerConfiguration.DefaultAadResourceServerWebSecurityConfigurerAdapter.class); + assertThat(context).hasSingleBean(TestSecurityFilterChain.class); + + }); } @EnableWebSecurity static class TestAadResourceServerWebSecurityConfigurerAdapter extends AadResourceServerWebSecurityConfigurerAdapter { - /** - * Configure the default Resource Server for Azure AD. - * - * @param http the {@link HttpSecurity} to use - * @throws Exception Configuration failed - */ @Override protected void configure(HttpSecurity http) throws Exception { super.configure(http); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfigurationTests.java index 173b16f4bd9b..53ad8d4ee3ff 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfigurationTests.java @@ -1,3 +1,6 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + package com.azure.spring.cloud.autoconfigure.aad.configuration; import com.azure.spring.cloud.autoconfigure.aad.AadAutoConfiguration; @@ -24,31 +27,27 @@ public class AadWebApplicationConfigurationTests { @Test void useDefaultWebSecurityConfigurerAdapter() { webApplicationContextRunner() - .withPropertyValues( - "spring.cloud.azure.active-directory.enabled=true", + .withPropertyValues("spring.cloud.azure.active-directory.enabled=true", "spring.cloud.azure.active-directory.credential.client-id=fake-client-id" ) .run(context -> { - assertThat(context).hasSingleBean(AadWebSecurityConfigurerAdapter.class); - assertThat(context).hasSingleBean(AadWebApplicationConfiguration.DefaultAadWebSecurityConfigurerAdapter.class); - } - ); + assertThat(context).hasSingleBean(AadWebSecurityConfigurerAdapter.class); + assertThat(context).hasSingleBean(AadWebApplicationConfiguration.DefaultAadWebSecurityConfigurerAdapter.class); + }); } @Test void useCustomWebSecurityConfigurerAdapter() { webApplicationContextRunner() .withUserConfiguration(TestAadWebSecurityConfigurerAdapter.class) - .withPropertyValues( - "spring.cloud.azure.active-directory.enabled=true", + .withPropertyValues("spring.cloud.azure.active-directory.enabled=true", "spring.cloud.azure.active-directory.credential.client-id=fake-client-id" ) .run(context -> { - assertThat(context).hasSingleBean(WebSecurityConfigurerAdapter.class); - assertThat(context).doesNotHaveBean(AadWebApplicationConfiguration.DefaultAadWebSecurityConfigurerAdapter.class); - assertThat(context).hasSingleBean(TestAadWebSecurityConfigurerAdapter.class); - } - ); + assertThat(context).hasSingleBean(WebSecurityConfigurerAdapter.class); + assertThat(context).doesNotHaveBean(AadWebApplicationConfiguration.DefaultAadWebSecurityConfigurerAdapter.class); + assertThat(context).hasSingleBean(TestAadWebSecurityConfigurerAdapter.class); + }); } @Test @@ -61,29 +60,21 @@ void useCustomSecurityFilterChain() { AadResourceServerConfigurationTests.TestSecurityFilterChain.class, AadAutoConfiguration.class) .withInitializer(new ConditionEvaluationReportLoggingListener(LogLevel.INFO)) - .withPropertyValues( - "spring.cloud.azure.active-directory.enabled=true", + .withPropertyValues("spring.cloud.azure.active-directory.enabled=true", "spring.cloud.azure.active-directory.credential.client-id=fake-client-id" ) .run(context -> { - assertThat(context).hasSingleBean(SecurityFilterChain.class); - assertThat(context).doesNotHaveBean(WebSecurityConfigurerAdapter.class); - assertThat(context).doesNotHaveBean(AadWebApplicationConfiguration.DefaultAadWebSecurityConfigurerAdapter.class); - assertThat(context).hasSingleBean(AadResourceServerConfigurationTests.TestSecurityFilterChain.class); - } - ); + assertThat(context).hasSingleBean(SecurityFilterChain.class); + assertThat(context).doesNotHaveBean(WebSecurityConfigurerAdapter.class); + assertThat(context).doesNotHaveBean(AadWebApplicationConfiguration.DefaultAadWebSecurityConfigurerAdapter.class); + assertThat(context).hasSingleBean(AadResourceServerConfigurationTests.TestSecurityFilterChain.class); + }); } @EnableWebSecurity static class TestAadWebSecurityConfigurerAdapter extends AadWebSecurityConfigurerAdapter { - /** - * Configure the default Resource Server for Azure AD. - * - * @param http the {@link HttpSecurity} to use - * @throws Exception Configuration failed - */ @Override protected void configure(HttpSecurity http) throws Exception { super.configure(http); From c4cf544467bef19adc19875257b6eea0f6e5e4b1 Mon Sep 17 00:00:00 2001 From: Shili Chen Date: Thu, 27 Jul 2023 13:58:32 +0800 Subject: [PATCH 3/4] Update UT --- .../configuration/AadResourceServerConfigurationTests.java | 4 ++-- .../configuration/AadWebApplicationConfigurationTests.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfigurationTests.java index 1e646951d278..689fce02ba9b 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfigurationTests.java @@ -67,7 +67,7 @@ void useCustomSecurityFilterChain() { assertThat(context).hasSingleBean(SecurityFilterChain.class); assertThat(context).doesNotHaveBean(WebSecurityConfigurerAdapter.class); assertThat(context).doesNotHaveBean(AadResourceServerConfiguration.DefaultAadResourceServerWebSecurityConfigurerAdapter.class); - assertThat(context).hasSingleBean(TestSecurityFilterChain.class); + assertThat(context).hasBean("testSecurityFilterChain"); }); } @@ -86,7 +86,7 @@ protected void configure(HttpSecurity http) throws Exception { static class TestSecurityFilterChain { @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + public SecurityFilterChain testSecurityFilterChain(HttpSecurity http) throws Exception { return http.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt).build(); } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfigurationTests.java index 53ad8d4ee3ff..fee6fa573b4a 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfigurationTests.java @@ -67,7 +67,7 @@ void useCustomSecurityFilterChain() { assertThat(context).hasSingleBean(SecurityFilterChain.class); assertThat(context).doesNotHaveBean(WebSecurityConfigurerAdapter.class); assertThat(context).doesNotHaveBean(AadWebApplicationConfiguration.DefaultAadWebSecurityConfigurerAdapter.class); - assertThat(context).hasSingleBean(AadResourceServerConfigurationTests.TestSecurityFilterChain.class); + assertThat(context).hasBean("testSecurityFilterChain"); }); } @@ -85,7 +85,7 @@ protected void configure(HttpSecurity http) throws Exception { static class TestSecurityFilterChain { @Bean - public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception { + public SecurityFilterChain testSecurityFilterChain(HttpSecurity http) throws Exception { return http.oauth2Login(Customizer.withDefaults()).authorizeRequests(request -> request.anyRequest().authenticated()).build(); } } From 36b0989ba97ebe723959007e7ae58e321e2329b8 Mon Sep 17 00:00:00 2001 From: Shili Chen Date: Thu, 27 Jul 2023 16:11:48 +0800 Subject: [PATCH 4/4] Fix comments --- sdk/spring/CHANGELOG.md | 2 +- .../aad/configuration/AadResourceServerConfigurationTests.java | 2 +- .../aad/configuration/AadWebApplicationConfigurationTests.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/spring/CHANGELOG.md b/sdk/spring/CHANGELOG.md index 486d2f6e41dc..ce7ebf3302bc 100644 --- a/sdk/spring/CHANGELOG.md +++ b/sdk/spring/CHANGELOG.md @@ -9,7 +9,7 @@ This section includes changes in `spring-cloud-azure-autoconfigure` module. #### Bugs Fixed - Fix the issue that `AzureMessagingListenerAutoConfiguration` not included in spring.factories [#34690](https://github.com/Azure/azure-sdk-for-java/issues/34690), [#35716](https://github.com/Azure/azure-sdk-for-java/pull/35716). -- Fix AAD default configuration condition is not perfect [#36124](https://github.com/Azure/azure-sdk-for-java/pull/36124). +- Fix default AAD configuration could be activated multiple times [#36124](https://github.com/Azure/azure-sdk-for-java/pull/36124). ## 4.9.0 (2023-06-29) - This release is compatible with Spring Boot 2.5.0-2.5.15, 2.6.0-2.6.15, 2.7.0-2.7.11. (Note: 2.5.x (x>15), 2.6.y (y>15) and 2.7.z (z>11) should be supported, but they aren't tested with this release.) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfigurationTests.java index 689fce02ba9b..2d2f49f60579 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadResourceServerConfigurationTests.java @@ -23,7 +23,7 @@ import static com.azure.spring.cloud.autoconfigure.aad.implementation.WebApplicationContextRunnerUtils.resourceServerRunner; import static org.assertj.core.api.Assertions.assertThat; -public class AadResourceServerConfigurationTests { +class AadResourceServerConfigurationTests { @Test void useDefaultWebSecurityConfigurerAdapter() { resourceServerRunner() diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfigurationTests.java index fee6fa573b4a..ec0cbb130f06 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadWebApplicationConfigurationTests.java @@ -23,7 +23,7 @@ import static com.azure.spring.cloud.autoconfigure.aad.implementation.WebApplicationContextRunnerUtils.webApplicationContextRunner; import static org.assertj.core.api.Assertions.assertThat; -public class AadWebApplicationConfigurationTests { +class AadWebApplicationConfigurationTests { @Test void useDefaultWebSecurityConfigurerAdapter() { webApplicationContextRunner()