1818import java .time .Duration ;
1919import java .util .ArrayList ;
2020import java .util .List ;
21+ import java .util .stream .Collectors ;
2122
2223import org .junit .Test ;
2324import reactor .core .publisher .Flux ;
2425
26+ import org .springframework .beans .BeansException ;
2527import org .springframework .boot .autoconfigure .AutoConfigurations ;
28+ import org .springframework .boot .autoconfigure .security .reactive .ReactiveSecurityAutoConfiguration ;
2629import org .springframework .boot .test .context .FilteredClassLoader ;
30+ import org .springframework .boot .test .context .assertj .AssertableReactiveWebApplicationContext ;
2731import org .springframework .boot .test .context .runner .ApplicationContextRunner ;
32+ import org .springframework .boot .test .context .runner .ReactiveWebApplicationContextRunner ;
2833import org .springframework .boot .test .context .runner .WebApplicationContextRunner ;
34+ import org .springframework .context .ApplicationContext ;
35+ import org .springframework .context .ApplicationContextAware ;
2936import org .springframework .context .annotation .Bean ;
3037import org .springframework .context .annotation .Configuration ;
3138import org .springframework .context .annotation .Import ;
39+ import org .springframework .security .config .BeanIds ;
3240import org .springframework .security .config .annotation .web .reactive .EnableWebFluxSecurity ;
41+ import org .springframework .security .config .web .server .ServerHttpSecurity ;
3342import org .springframework .security .oauth2 .client .InMemoryReactiveOAuth2AuthorizedClientService ;
3443import org .springframework .security .oauth2 .client .ReactiveOAuth2AuthorizedClientService ;
3544import org .springframework .security .oauth2 .client .registration .ClientRegistration ;
3847import org .springframework .security .oauth2 .client .registration .ReactiveClientRegistrationRepository ;
3948import org .springframework .security .oauth2 .client .web .server .AuthenticatedPrincipalServerOAuth2AuthorizedClientRepository ;
4049import org .springframework .security .oauth2 .client .web .server .ServerOAuth2AuthorizedClientRepository ;
50+ import org .springframework .security .oauth2 .client .web .server .authentication .OAuth2LoginAuthenticationWebFilter ;
4151import org .springframework .security .oauth2 .core .AuthorizationGrantType ;
52+ import org .springframework .security .web .server .SecurityWebFilterChain ;
53+ import org .springframework .test .util .ReflectionTestUtils ;
54+ import org .springframework .web .server .WebFilter ;
4255
4356import static org .assertj .core .api .Assertions .assertThat ;
4457
4962 */
5063public class ReactiveOAuth2ClientAutoConfigurationTests {
5164
52- private ApplicationContextRunner contextRunner = new ApplicationContextRunner ()
53- .withConfiguration ( AutoConfigurations . of (ReactiveOAuth2ClientAutoConfiguration .class ));
65+ private ApplicationContextRunner contextRunner = new ApplicationContextRunner (). withConfiguration ( AutoConfigurations
66+ .of (ReactiveOAuth2ClientAutoConfiguration . class , ReactiveSecurityAutoConfiguration .class ));
5467
5568 private static final String REGISTRATION_PREFIX = "spring.security.oauth2.client.registration" ;
5669
@@ -82,15 +95,19 @@ public void clientRegistrationRepositoryBeanShouldBeCreatedWhenPropertiesPresent
8295 }
8396
8497 @ Test
85- public void authorizedClientServiceBeanIsConditionalOnClientRegistrationRepository () {
86- this .contextRunner
87- .run ((context ) -> assertThat (context ).doesNotHaveBean (ReactiveOAuth2AuthorizedClientService .class ));
98+ public void authorizedClientServiceAndRepositoryBeansAreConditionalOnClientRegistrationRepository () {
99+ this .contextRunner .run ((context ) -> {
100+ assertThat (context ).doesNotHaveBean (ReactiveOAuth2AuthorizedClientService .class );
101+ assertThat (context ).doesNotHaveBean (ServerOAuth2AuthorizedClientRepository .class );
102+ });
88103 }
89104
90105 @ Test
91- public void configurationRegistersAuthorizedClientServiceBean () {
92- this .contextRunner .withUserConfiguration (ReactiveClientRepositoryConfiguration .class ).run (
93- (context ) -> assertThat (context ).hasSingleBean (InMemoryReactiveClientRegistrationRepository .class ));
106+ public void configurationRegistersAuthorizedClientServiceAndRepositoryBeans () {
107+ this .contextRunner .withUserConfiguration (ReactiveClientRepositoryConfiguration .class ).run ((context ) -> {
108+ assertThat (context ).hasSingleBean (InMemoryReactiveOAuth2AuthorizedClientService .class );
109+ assertThat (context ).hasSingleBean (AuthenticatedPrincipalServerOAuth2AuthorizedClientRepository .class );
110+ });
94111 }
95112
96113 @ Test
@@ -124,6 +141,22 @@ public void authorizedClientRepositoryBeanIsConditionalOnMissingBean() {
124141 });
125142 }
126143
144+ @ Test
145+ public void securityWebFilterChainBeanConditionalOnWebApplication () {
146+ this .contextRunner .withUserConfiguration (ReactiveOAuth2AuthorizedClientRepositoryConfiguration .class )
147+ .run ((context ) -> assertThat (context ).doesNotHaveBean (SecurityWebFilterChain .class ));
148+ }
149+
150+ @ Test
151+ public void configurationRegistersSecurityWebFilterChainBean () { // gh-17949
152+ new ReactiveWebApplicationContextRunner ()
153+ .withConfiguration (AutoConfigurations .of (ReactiveOAuth2ClientAutoConfiguration .class ))
154+ .withUserConfiguration (ReactiveOAuth2AuthorizedClientServiceConfiguration .class ,
155+ ServerHttpSecurityConfiguration .class )
156+ .run ((context ) -> assertThat (getFilters (context , OAuth2LoginAuthenticationWebFilter .class ))
157+ .isNotNull ());
158+ }
159+
127160 @ Test
128161 public void autoConfigurationConditionalOnClassFlux () {
129162 assertWhenClassNotPresent (Flux .class );
@@ -147,6 +180,15 @@ private void assertWhenClassNotPresent(Class<?> classToFilter) {
147180 .run ((context ) -> assertThat (context ).doesNotHaveBean (ReactiveOAuth2ClientAutoConfiguration .class ));
148181 }
149182
183+ @ SuppressWarnings ("unchecked" )
184+ private List <WebFilter > getFilters (AssertableReactiveWebApplicationContext context ,
185+ Class <? extends WebFilter > filter ) {
186+ SecurityWebFilterChain filterChain = (SecurityWebFilterChain ) context
187+ .getBean (BeanIds .SPRING_SECURITY_FILTER_CHAIN );
188+ List <WebFilter > filters = (List <WebFilter >) ReflectionTestUtils .getField (filterChain , "filters" );
189+ return filters .stream ().filter (filter ::isInstance ).collect (Collectors .toList ());
190+ }
191+
150192 @ Configuration
151193 static class ReactiveClientRepositoryConfiguration {
152194
@@ -196,4 +238,24 @@ public ServerOAuth2AuthorizedClientRepository testAuthorizedClientRepository(
196238
197239 }
198240
241+ @ Configuration
242+ static class ServerHttpSecurityConfiguration {
243+
244+ @ Bean
245+ ServerHttpSecurity http () {
246+ TestServerHttpSecurity httpSecurity = new TestServerHttpSecurity ();
247+ return httpSecurity ;
248+ }
249+
250+ static class TestServerHttpSecurity extends ServerHttpSecurity implements ApplicationContextAware {
251+
252+ @ Override
253+ public void setApplicationContext (ApplicationContext applicationContext ) throws BeansException {
254+ super .setApplicationContext (applicationContext );
255+ }
256+
257+ }
258+
259+ }
260+
199261}
0 commit comments