1717package org .springframework .integration .webflux .dsl ;
1818
1919import static org .hamcrest .Matchers .instanceOf ;
20+ import static org .hamcrest .Matchers .is ;
2021import static org .junit .Assert .assertNotNull ;
2122import static org .junit .Assert .assertThat ;
2223import static org .springframework .security .test .web .servlet .request .SecurityMockMvcRequestPostProcessors .httpBasic ;
23- import static org .springframework .security .test .web .servlet .setup .SecurityMockMvcConfigurers .springSecurity ;
2424import static org .springframework .test .web .servlet .request .MockMvcRequestBuilders .get ;
2525import static org .springframework .test .web .servlet .result .MockMvcResultMatchers .content ;
26+ import static org .springframework .web .reactive .function .client .ExchangeFilterFunctions .Credentials .basicAuthenticationCredentials ;
27+ import static org .springframework .web .reactive .function .client .ExchangeFilterFunctions .basicAuthentication ;
2628
29+ import java .security .Principal ;
2730import java .util .Collections ;
2831
2932import javax .annotation .Resource ;
4851import org .springframework .integration .config .EnableIntegration ;
4952import org .springframework .integration .dsl .IntegrationFlow ;
5053import org .springframework .integration .dsl .IntegrationFlows ;
54+ import org .springframework .integration .http .HttpHeaders ;
5155import org .springframework .integration .http .dsl .Http ;
5256import org .springframework .integration .support .MessageBuilder ;
5357import org .springframework .integration .webflux .outbound .WebFluxRequestExecutingMessageHandler ;
6064import org .springframework .security .config .annotation .web .builders .HttpSecurity ;
6165import org .springframework .security .config .annotation .web .configuration .EnableWebSecurity ;
6266import org .springframework .security .config .annotation .web .configuration .WebSecurityConfigurerAdapter ;
67+ import org .springframework .security .config .annotation .web .reactive .EnableWebFluxSecurity ;
68+ import org .springframework .security .config .web .server .ServerHttpSecurity ;
69+ import org .springframework .security .core .userdetails .MapReactiveUserDetailsService ;
70+ import org .springframework .security .core .userdetails .ReactiveUserDetailsService ;
6371import org .springframework .security .core .userdetails .User ;
72+ import org .springframework .security .core .userdetails .UserDetails ;
6473import org .springframework .security .core .userdetails .UserDetailsService ;
6574import org .springframework .security .crypto .factory .PasswordEncoderFactories ;
6675import org .springframework .security .provisioning .InMemoryUserDetailsManager ;
76+ import org .springframework .security .test .web .reactive .server .SecurityMockServerConfigurers ;
77+ import org .springframework .security .test .web .servlet .setup .SecurityMockMvcConfigurers ;
78+ import org .springframework .security .web .server .SecurityWebFilterChain ;
6779import org .springframework .test .annotation .DirtiesContext ;
6880import org .springframework .test .context .junit4 .SpringRunner ;
6981import org .springframework .test .context .web .WebAppConfiguration ;
@@ -116,11 +128,14 @@ public class WebFluxDslTests {
116128 public void setup () {
117129 this .mockMvc =
118130 MockMvcBuilders .webAppContextSetup (this .wac )
119- .apply (springSecurity ())
131+ .apply (SecurityMockMvcConfigurers . springSecurity ())
120132 .build ();
121133
122134 this .webTestClient =
123135 WebTestClient .bindToApplicationContext (this .wac )
136+ .apply (SecurityMockServerConfigurers .springSecurity ())
137+ .configureClient ()
138+ .filter (basicAuthentication ())
124139 .build ();
125140 }
126141
@@ -198,6 +213,7 @@ public void testHttpReactiveProxyFlow() throws Exception {
198213 @ SuppressWarnings ("unchecked" )
199214 public void testHttpReactivePost () {
200215 this .webTestClient .post ().uri ("/reactivePost" )
216+ .attributes (basicAuthenticationCredentials ("guest" , "guest" ))
201217 .body (Mono .just ("foo\n bar\n baz" ), String .class )
202218 .exchange ()
203219 .expectStatus ().isAccepted ();
@@ -206,6 +222,8 @@ public void testHttpReactivePost() {
206222 assertNotNull (store );
207223 assertThat (store .getPayload (), instanceOf (Flux .class ));
208224
225+ assertThat (store .getHeaders ().get (HttpHeaders .USER_PRINCIPAL , Principal .class ).getName (), is ("guest" ));
226+
209227 StepVerifier
210228 .create ((Publisher <String >) store .getPayload ())
211229 .expectNext ("foo" , "bar" , "baz" )
@@ -217,6 +235,7 @@ public void testHttpReactivePost() {
217235 public void testSse () {
218236 Flux <String > responseBody =
219237 this .webTestClient .get ().uri ("/sse" )
238+ .attributes (basicAuthenticationCredentials ("guest" , "guest" ))
220239 .exchange ()
221240 .returnResult (String .class )
222241 .getResponseBody ();
@@ -230,22 +249,40 @@ public void testSse() {
230249 @ Configuration
231250 @ EnableWebFlux
232251 @ EnableWebSecurity
252+ @ EnableWebFluxSecurity
233253 @ EnableIntegration
234254 public static class ContextConfiguration extends WebSecurityConfigurerAdapter {
235255
256+ @ Bean
257+ public UserDetails userDetails () {
258+ return User .withUsername ("guest" )
259+ .passwordEncoder (PasswordEncoderFactories .createDelegatingPasswordEncoder ()::encode )
260+ .password ("guest" )
261+ .roles ("ADMIN" )
262+ .build ();
263+ }
264+
236265 @ Override
237266 @ Bean
238267 public UserDetailsService userDetailsService () {
239- InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager ();
268+ return new InMemoryUserDetailsManager (userDetails ());
269+ }
240270
241- manager .createUser (
242- User .withUsername ("guest" )
243- .passwordEncoder (PasswordEncoderFactories .createDelegatingPasswordEncoder ()::encode )
244- .password ("guest" )
245- .roles ("ADMIN" )
246- .build ());
271+ @ Bean
272+ public ReactiveUserDetailsService reactiveUserDetailsService () {
273+ return new MapReactiveUserDetailsService (userDetails ());
274+ }
247275
248- return manager ;
276+
277+ @ Bean
278+ public SecurityWebFilterChain reactiveSpringSecurityFilterChain (ServerHttpSecurity http ) {
279+ return http .authorizeExchange ()
280+ .anyExchange ().hasRole ("ADMIN" )
281+ .and ()
282+ .httpBasic ()
283+ .and ()
284+ .csrf ().disable ()
285+ .build ();
249286 }
250287
251288 @ Override
0 commit comments