18
18
import java .time .Duration ;
19
19
import java .util .ArrayList ;
20
20
import java .util .List ;
21
+ import java .util .stream .Collectors ;
21
22
22
23
import org .junit .Test ;
23
24
import reactor .core .publisher .Flux ;
24
25
26
+ import org .springframework .beans .BeansException ;
25
27
import org .springframework .boot .autoconfigure .AutoConfigurations ;
28
+ import org .springframework .boot .autoconfigure .security .reactive .ReactiveSecurityAutoConfiguration ;
26
29
import org .springframework .boot .test .context .FilteredClassLoader ;
30
+ import org .springframework .boot .test .context .assertj .AssertableReactiveWebApplicationContext ;
27
31
import org .springframework .boot .test .context .runner .ApplicationContextRunner ;
32
+ import org .springframework .boot .test .context .runner .ReactiveWebApplicationContextRunner ;
28
33
import org .springframework .boot .test .context .runner .WebApplicationContextRunner ;
34
+ import org .springframework .context .ApplicationContext ;
35
+ import org .springframework .context .ApplicationContextAware ;
29
36
import org .springframework .context .annotation .Bean ;
30
37
import org .springframework .context .annotation .Configuration ;
31
38
import org .springframework .context .annotation .Import ;
39
+ import org .springframework .security .config .BeanIds ;
32
40
import org .springframework .security .config .annotation .web .reactive .EnableWebFluxSecurity ;
41
+ import org .springframework .security .config .web .server .ServerHttpSecurity ;
33
42
import org .springframework .security .oauth2 .client .InMemoryReactiveOAuth2AuthorizedClientService ;
34
43
import org .springframework .security .oauth2 .client .ReactiveOAuth2AuthorizedClientService ;
35
44
import org .springframework .security .oauth2 .client .registration .ClientRegistration ;
38
47
import org .springframework .security .oauth2 .client .registration .ReactiveClientRegistrationRepository ;
39
48
import org .springframework .security .oauth2 .client .web .server .AuthenticatedPrincipalServerOAuth2AuthorizedClientRepository ;
40
49
import org .springframework .security .oauth2 .client .web .server .ServerOAuth2AuthorizedClientRepository ;
50
+ import org .springframework .security .oauth2 .client .web .server .authentication .OAuth2LoginAuthenticationWebFilter ;
41
51
import 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 ;
42
55
43
56
import static org .assertj .core .api .Assertions .assertThat ;
44
57
49
62
*/
50
63
public class ReactiveOAuth2ClientAutoConfigurationTests {
51
64
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 ));
54
67
55
68
private static final String REGISTRATION_PREFIX = "spring.security.oauth2.client.registration" ;
56
69
@@ -82,15 +95,19 @@ public void clientRegistrationRepositoryBeanShouldBeCreatedWhenPropertiesPresent
82
95
}
83
96
84
97
@ 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
+ });
88
103
}
89
104
90
105
@ 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
+ });
94
111
}
95
112
96
113
@ Test
@@ -124,6 +141,22 @@ public void authorizedClientRepositoryBeanIsConditionalOnMissingBean() {
124
141
});
125
142
}
126
143
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
+
127
160
@ Test
128
161
public void autoConfigurationConditionalOnClassFlux () {
129
162
assertWhenClassNotPresent (Flux .class );
@@ -147,6 +180,15 @@ private void assertWhenClassNotPresent(Class<?> classToFilter) {
147
180
.run ((context ) -> assertThat (context ).doesNotHaveBean (ReactiveOAuth2ClientAutoConfiguration .class ));
148
181
}
149
182
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
+
150
192
@ Configuration
151
193
static class ReactiveClientRepositoryConfiguration {
152
194
@@ -196,4 +238,24 @@ public ServerOAuth2AuthorizedClientRepository testAuthorizedClientRepository(
196
238
197
239
}
198
240
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
+
199
261
}
0 commit comments