浏览代码

Separate Servlet and WebFlux

Fixes: gh-5836
Rob Winch 7 年之前
父节点
当前提交
57359058dd
共有 59 个文件被更改,包括 204 次插入190 次删除
  1. 7 0
      docs/manual/src/docs/asciidoc/_includes/reactive/index.adoc
  2. 103 0
      docs/manual/src/docs/asciidoc/_includes/reactive/method.adoc
  3. 68 0
      docs/manual/src/docs/asciidoc/_includes/reactive/webflux.adoc
  4. 5 5
      docs/manual/src/docs/asciidoc/_includes/reactive/webtestclient.adoc
  5. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/acls.adoc
  6. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/cas.adoc
  7. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/concurrency.adoc
  8. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/crypto.adoc
  9. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/index.adoc
  10. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/jaas.adoc
  11. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/jsp-taglibs.adoc
  12. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/ldap.adoc
  13. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/mvc.adoc
  14. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/oauth2.adoc
  15. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/preauth.adoc
  16. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/runas.adoc
  17. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/x509.adoc
  18. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/appendix/database-schema.adoc
  19. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/appendix/dependencies.adoc
  20. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/appendix/faq.adoc
  21. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/appendix/index.adoc
  22. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/appendix/namespace.adoc
  23. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/appendix/proxy-server.adoc
  24. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/architecture/core-services.adoc
  25. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/architecture/index.adoc
  26. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/architecture/jackson.adoc
  27. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/architecture/password-encoder.adoc
  28. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/architecture/technical-overview.adoc
  29. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/authorization/architecture.adoc
  30. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/authorization/expression-based.adoc
  31. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/authorization/index.adoc
  32. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/authorization/secure-objects.adoc
  33. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/data/index.adoc
  34. 17 0
      docs/manual/src/docs/asciidoc/_includes/servlet/index.adoc
  35. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/preface/community.adoc
  36. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/preface/getting-started.adoc
  37. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/preface/guides.adoc
  38. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/preface/index.adoc
  39. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/preface/introduction.adoc
  40. 0 172
      docs/manual/src/docs/asciidoc/_includes/servlet/preface/java-configuration.adoc
  41. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/preface/namespace.adoc
  42. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/preface/samples.adoc
  43. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/preface/whats-new.adoc
  44. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/test/index.adoc
  45. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/test/method.adoc
  46. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/test/mockmvc.adoc
  47. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/web/anonymous.adoc
  48. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/web/basic.adoc
  49. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/web/core-filters.adoc
  50. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/web/cors.adoc
  51. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/web/csrf.adoc
  52. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/web/headers.adoc
  53. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/web/index.adoc
  54. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/web/rememberme.adoc
  55. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/web/security-filter-chain.adoc
  56. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/web/servlet-api.adoc
  57. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/web/session-management.adoc
  58. 0 0
      docs/manual/src/docs/asciidoc/_includes/servlet/web/websocket.adoc
  59. 4 13
      docs/manual/src/docs/asciidoc/index.adoc

+ 7 - 0
docs/manual/src/docs/asciidoc/_includes/reactive/index.adoc

@@ -0,0 +1,7 @@
+= Reactive Applications
+
+include::webflux.adoc[leveloffset=+1]
+
+include::method.adoc[leveloffset=+1]
+
+include::webtestclient.adoc[leveloffset=+1]

+ 103 - 0
docs/manual/src/docs/asciidoc/_includes/reactive/method.adoc

@@ -0,0 +1,103 @@
+[[jc-erms]]
+= EnableReactiveMethodSecurity
+
+Spring Security supports method security using https://projectreactor.io/docs/core/release/reference/#context[Reactor's Context] which is setup using `ReactiveSecurityContextHolder`.
+For example, this demonstrates how to retrieve the currently logged in user's message.
+
+[NOTE]
+====
+For this to work the return type of the method must be a `org.reactivestreams.Publisher` (i.e. `Mono`/`Flux`).
+This is necessary to integrate with Reactor's `Context`.
+====
+
+[source,java]
+----
+Authentication authentication = new TestingAuthenticationToken("user", "password", "ROLE_USER");
+
+Mono<String> messageByUsername = ReactiveSecurityContextHolder.getContext()
+	.map(SecurityContext::getAuthentication)
+	.map(Authentication::getName)
+	.flatMap(this::findMessageByUsername)
+	// In a WebFlux application the `subscriberContext` is automatically setup using `ReactorContextWebFilter`
+	.subscriberContext(ReactiveSecurityContextHolder.withAuthentication(authentication));
+
+StepVerifier.create(messageByUsername)
+	.expectNext("Hi user")
+	.verifyComplete();
+----
+
+with `this::findMessageByUsername` defined as:
+
+[source,java]
+----
+Mono<String> findMessageByUsername(String username) {
+	return Mono.just("Hi " + username);
+}
+----
+
+Below is a minimal method security configuration when using method security in reactive applications.
+
+[source,java]
+----
+@EnableReactiveMethodSecurity
+public class SecurityConfig {
+	@Bean
+	public MapReactiveUserDetailsService userDetailsService() {
+		User.UserBuilder userBuilder = User.withDefaultPasswordEncoder();
+		UserDetails rob = userBuilder.username("rob").password("rob").roles("USER").build();
+		UserDetails admin = userBuilder.username("admin").password("admin").roles("USER","ADMIN").build();
+		return new MapReactiveUserDetailsService(rob, admin);
+	}
+}
+----
+
+Consider the following class:
+
+[source,java]
+----
+@Component
+public class HelloWorldMessageService {
+	@PreAuthorize("hasRole('ADMIN')")
+	public Mono<String> findMessage() {
+		return Mono.just("Hello World!");
+	}
+}
+----
+
+Combined with our configuration above, `@PreAuthorize("hasRole('ADMIN')")` will ensure that `findByMessage` is only invoked by a user with the role `ADMIN`.
+It is important to note that any of the expressions in standard method security work for `@EnableReactiveMethodSecurity`.
+However, at this time we only support return type of `Boolean` or `boolean` of the expression.
+This means that the expression must not block.
+
+When integrating with <<jc-webflux>>, the Reactor Context is automatically established by Spring Security according to the authenticated user.
+
+[source,java]
+----
+@EnableWebFluxSecurity
+@EnableReactiveMethodSecurity
+public class SecurityConfig {
+
+	@Bean
+	SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http) throws Exception {
+		return http
+			// Demonstrate that method security works
+			// Best practice to use both for defense in depth
+			.authorizeExchange()
+				.anyExchange().permitAll()
+				.and()
+			.httpBasic().and()
+			.build();
+	}
+
+	@Bean
+	MapReactiveUserDetailsService userDetailsService() {
+		User.UserBuilder userBuilder = User.withDefaultPasswordEncoder();
+		UserDetails rob = userBuilder.username("rob").password("rob").roles("USER").build();
+		UserDetails admin = userBuilder.username("admin").password("admin").roles("USER","ADMIN").build();
+		return new MapReactiveUserDetailsService(rob, admin);
+	}
+}
+
+----
+
+You can find a complete sample in {gh-samples-url}/javaconfig/hellowebflux-method[hellowebflux-method]

+ 68 - 0
docs/manual/src/docs/asciidoc/_includes/reactive/webflux.adoc

@@ -0,0 +1,68 @@
+[[jc-webflux]]
+= WebFlux Security
+
+Spring Security's WebFlux support relies on a `WebFilter` and works the same for Spring WebFlux and Spring WebFlux.Fn.
+You can find a few sample applications that demonstrate the code below:
+
+* Hello WebFlux {gh-samples-url}/javaconfig/hellowebflux[hellowebflux]
+* Hello WebFlux.Fn {gh-samples-url}/javaconfig/hellowebfluxfn[hellowebfluxfn]
+* Hello WebFlux Method {gh-samples-url}/javaconfig/hellowebflux-method[hellowebflux-method]
+
+
+== Minimal WebFlux Security Configuration
+
+You can find a minimal WebFlux Security configuration below:
+
+[source,java]
+-----
+@EnableWebFluxSecurity
+public class HelloWebfluxSecurityConfig {
+
+	@Bean
+	public MapReactiveUserDetailsService userDetailsService() {
+		UserDetails user = User.withDefaultPasswordEncoder()
+			.username("user")
+			.password("user")
+			.roles("USER")
+			.build();
+		return new MapReactiveUserDetailsService(user);
+	}
+}
+-----
+
+This configuration provides form and http basic authentication, sets up authorization to require an authenticated user for accessing any page, sets up a default log in page and a default log out page, sets up security related HTTP headers, CSRF protection, and more.
+
+== Explicit WebFlux Security Configuration
+
+You can find an explicit version of the minimal WebFlux Security configuration below:
+
+[source,java]
+-----
+@EnableWebFluxSecurity
+public class HelloWebfluxSecurityConfig {
+
+	@Bean
+	public MapReactiveUserDetailsService userDetailsService() {
+		UserDetails user = User.withDefaultPasswordEncoder()
+			.username("user")
+			.password("user")
+			.roles("USER")
+			.build();
+		return new MapReactiveUserDetailsService(user);
+	}
+
+	@Bean
+	public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
+		http
+			.authorizeExchange()
+				.anyExchange().authenticated()
+				.and()
+			.httpBasic().and()
+			.formLogin();
+		return http.build();
+	}
+}
+-----
+
+This configuration explicitly sets up all the same things as our minimal configuration.
+From here you can easily make the changes to the defaults.

+ 5 - 5
docs/manual/src/docs/asciidoc/_includes/test/webtestclient.adoc → docs/manual/src/docs/asciidoc/_includes/reactive/webtestclient.adoc

@@ -1,8 +1,8 @@
 [[test-webflux]]
-== WebFlux Support
+= WebFlux Support
 
 [[test-erms]]
-=== Reactive Method Security
+== Reactive Method Security
 
 For example, we can test our example from <<jc-erms>> using the same setup and annotations we did in <<test-method>>.
 Here is a minimal sample of what we can do:
@@ -41,7 +41,7 @@ public class HelloWorldMessageServiceTests {
 ----
 
 [[test-webtestclient]]
-=== WebTestClientSupport
+== WebTestClientSupport
 
 Spring Security provides integration with `WebTestClient`.
 The basic setup looks like this:
@@ -70,7 +70,7 @@ public class HelloWebfluxMethodApplicationTests {
 }
 ----
 
-==== Authentication
+=== Authentication
 
 After applying the Spring Security support to `WebTestClient` we can use either annotations or `mutateWith` support.
 For example:
@@ -134,7 +134,7 @@ public void messageWhenMutateWithMockAdminThenOk() throws Exception {
 ----
 
 
-==== CSRF Support
+=== CSRF Support
 
 Spring Security also provides support for CSRF testing with `WebTestClient`.
 For example:

+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/additional-topics/acls.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/acls.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/additional-topics/cas.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/cas.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/additional-topics/concurrency.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/concurrency.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/additional-topics/crypto.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/crypto.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/additional-topics/index.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/index.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/additional-topics/jaas.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/jaas.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/additional-topics/jsp-taglibs.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/jsp-taglibs.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/additional-topics/ldap.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/ldap.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/additional-topics/mvc.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/mvc.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/additional-topics/oauth2.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/oauth2.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/additional-topics/preauth.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/preauth.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/additional-topics/runas.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/runas.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/additional-topics/x509.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/additional-topics/x509.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/appendix/database-schema.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/appendix/database-schema.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/appendix/dependencies.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/appendix/dependencies.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/appendix/faq.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/appendix/faq.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/appendix/index.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/appendix/index.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/appendix/namespace.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/appendix/namespace.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/appendix/proxy-server.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/appendix/proxy-server.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/architecture/core-services.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/architecture/core-services.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/architecture/index.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/architecture/index.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/architecture/jackson.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/architecture/jackson.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/architecture/password-encoder.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/architecture/password-encoder.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/architecture/technical-overview.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/architecture/technical-overview.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/authorization/architecture.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/authorization/architecture.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/authorization/expression-based.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/authorization/expression-based.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/authorization/index.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/authorization/index.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/authorization/secure-objects.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/authorization/secure-objects.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/data/index.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/data/index.adoc


+ 17 - 0
docs/manual/src/docs/asciidoc/_includes/servlet/index.adoc

@@ -0,0 +1,17 @@
+= Servlet Applications
+
+include::preface/index.adoc[leveloffset=+1]
+
+include::architecture/index.adoc[leveloffset=+1]
+
+include::test/index.adoc[leveloffset=+1]
+
+include::web/index.adoc[leveloffset=+1]
+
+include::authorization/index.adoc[leveloffset=+1]
+
+include::additional-topics/index.adoc[leveloffset=+1]
+
+include::data/index.adoc[leveloffset=+1]
+
+include::appendix/index.adoc[leveloffset=+1]

+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/preface/community.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/preface/community.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/preface/getting-started.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/preface/getting-started.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/preface/guides.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/preface/guides.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/preface/index.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/preface/index.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/preface/introduction.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/preface/introduction.adoc


+ 0 - 172
docs/manual/src/docs/asciidoc/_includes/preface/java-configuration.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/preface/java-configuration.adoc

@@ -383,74 +383,6 @@ If not configured a status code 200 will be returned by default.
 - Section <<cas-singlelogout, Single Logout>> (CAS protocol)
 - Documentation for the <<nsa-logout, logout element>> in the Spring Security XML Namespace section
 
-[[jc-webflux]]
-=== WebFlux Security
-
-Spring Security's WebFlux support relies on a `WebFilter` and works the same for Spring WebFlux and Spring WebFlux.Fn.
-You can find a few sample applications that demonstrate the code below:
-
-* Hello WebFlux {gh-samples-url}/javaconfig/hellowebflux[hellowebflux]
-* Hello WebFlux.Fn {gh-samples-url}/javaconfig/hellowebfluxfn[hellowebfluxfn]
-* Hello WebFlux Method {gh-samples-url}/javaconfig/hellowebflux-method[hellowebflux-method]
-
-
-==== Minimal WebFlux Security Configuration
-
-You can find a minimal WebFlux Security configuration below:
-
-[source,java]
------
-@EnableWebFluxSecurity
-public class HelloWebfluxSecurityConfig {
-
-	@Bean
-	public MapReactiveUserDetailsService userDetailsService() {
-		UserDetails user = User.withDefaultPasswordEncoder()
-			.username("user")
-			.password("user")
-			.roles("USER")
-			.build();
-		return new MapReactiveUserDetailsService(user);
-	}
-}
------
-
-This configuration provides form and http basic authentication, sets up authorization to require an authenticated user for accessing any page, sets up a default log in page and a default log out page, sets up security related HTTP headers, CSRF protection, and more.
-
-==== Explicit WebFlux Security Configuration
-
-You can find an explicit version of the minimal WebFlux Security configuration below:
-
-[source,java]
------
-@EnableWebFluxSecurity
-public class HelloWebfluxSecurityConfig {
-
-	@Bean
-	public MapReactiveUserDetailsService userDetailsService() {
-		UserDetails user = User.withDefaultPasswordEncoder()
-			.username("user")
-			.password("user")
-			.roles("USER")
-			.build();
-		return new MapReactiveUserDetailsService(user);
-	}
-
-	@Bean
-	public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
-		http
-			.authorizeExchange()
-				.anyExchange().authenticated()
-				.and()
-			.httpBasic().and()
-			.formLogin();
-		return http.build();
-	}
-}
------
-
-This configuration explicitly sets up all the same things as our minimal configuration.
-From here you can easily make the changes to the defaults.
 
 [[jc-oauth2login]]
 === OAuth 2.0 Login
@@ -1302,110 +1234,6 @@ public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
 
 For additional information about methods that can be overridden, refer to the `GlobalMethodSecurityConfiguration` Javadoc.
 
-[[jc-erms]]
-==== EnableReactiveMethodSecurity
-
-Spring Security supports method security using https://projectreactor.io/docs/core/release/reference/#context[Reactor's Context] which is setup using `ReactiveSecurityContextHolder`.
-For example, this demonstrates how to retrieve the currently logged in user's message.
-
-[NOTE]
-====
-For this to work the return type of the method must be a `org.reactivestreams.Publisher` (i.e. `Mono`/`Flux`).
-This is necessary to integrate with Reactor's `Context`.
-====
-
-[source,java]
-----
-Authentication authentication = new TestingAuthenticationToken("user", "password", "ROLE_USER");
-
-Mono<String> messageByUsername = ReactiveSecurityContextHolder.getContext()
-	.map(SecurityContext::getAuthentication)
-	.map(Authentication::getName)
-	.flatMap(this::findMessageByUsername)
-	// In a WebFlux application the `subscriberContext` is automatically setup using `ReactorContextWebFilter`
-	.subscriberContext(ReactiveSecurityContextHolder.withAuthentication(authentication));
-
-StepVerifier.create(messageByUsername)
-	.expectNext("Hi user")
-	.verifyComplete();
-----
-
-with `this::findMessageByUsername` defined as:
-
-[source,java]
-----
-Mono<String> findMessageByUsername(String username) {
-	return Mono.just("Hi " + username);
-}
-----
-
-Below is a minimal method security configuration when using method security in reactive applications.
-
-[source,java]
-----
-@EnableReactiveMethodSecurity
-public class SecurityConfig {
-	@Bean
-	public MapReactiveUserDetailsService userDetailsService() {
-		User.UserBuilder userBuilder = User.withDefaultPasswordEncoder();
-		UserDetails rob = userBuilder.username("rob").password("rob").roles("USER").build();
-		UserDetails admin = userBuilder.username("admin").password("admin").roles("USER","ADMIN").build();
-		return new MapReactiveUserDetailsService(rob, admin);
-	}
-}
-----
-
-Consider the following class:
-
-[source,java]
-----
-@Component
-public class HelloWorldMessageService {
-	@PreAuthorize("hasRole('ADMIN')")
-	public Mono<String> findMessage() {
-		return Mono.just("Hello World!");
-	}
-}
-----
-
-Combined with our configuration above, `@PreAuthorize("hasRole('ADMIN')")` will ensure that `findByMessage` is only invoked by a user with the role `ADMIN`.
-It is important to note that any of the expressions in standard method security work for `@EnableReactiveMethodSecurity`.
-However, at this time we only support return type of `Boolean` or `boolean` of the expression.
-This means that the expression must not block.
-
-When integrating with <<jc-webflux>>, the Reactor Context is automatically established by Spring Security according to the authenticated user.
-
-[source,java]
-----
-@EnableWebFluxSecurity
-@EnableReactiveMethodSecurity
-public class SecurityConfig {
-
-	@Bean
-	SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http) throws Exception {
-		return http
-			// Demonstrate that method security works
-			// Best practice to use both for defense in depth
-			.authorizeExchange()
-				.anyExchange().permitAll()
-				.and()
-			.httpBasic().and()
-			.build();
-	}
-
-	@Bean
-	MapReactiveUserDetailsService userDetailsService() {
-		User.UserBuilder userBuilder = User.withDefaultPasswordEncoder();
-		UserDetails rob = userBuilder.username("rob").password("rob").roles("USER").build();
-		UserDetails admin = userBuilder.username("admin").password("admin").roles("USER","ADMIN").build();
-		return new MapReactiveUserDetailsService(rob, admin);
-	}
-}
-
-----
-
-You can find a complete sample in {gh-samples-url}/javaconfig/hellowebflux-method[hellowebflux-method]
-
 === Post Processing Configured Objects
 
 Spring Security's Java Configuration does not expose every property of every object that it configures.

+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/preface/namespace.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/preface/namespace.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/preface/samples.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/preface/samples.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/preface/whats-new.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/preface/whats-new.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/test/index.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/test/index.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/test/method.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/test/method.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/test/mockmvc.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/test/mockmvc.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/web/anonymous.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/web/anonymous.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/web/basic.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/web/basic.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/web/core-filters.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/web/core-filters.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/web/cors.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/web/cors.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/web/csrf.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/web/csrf.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/web/headers.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/web/headers.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/web/index.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/web/index.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/web/rememberme.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/web/rememberme.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/web/security-filter-chain.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/web/security-filter-chain.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/web/servlet-api.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/web/servlet-api.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/web/session-management.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/web/session-management.adoc


+ 0 - 0
docs/manual/src/docs/asciidoc/_includes/web/websocket.adoc → docs/manual/src/docs/asciidoc/_includes/servlet/web/websocket.adoc


+ 4 - 13
docs/manual/src/docs/asciidoc/index.adoc

@@ -2,24 +2,15 @@
 Ben Alex; Luke Taylor; Rob Winch; Gunnar Hillert; Joe Grandja; Jay Bryant
 :include-dir: _includes
 :security-api-url: http://docs.spring.io/spring-security/site/docs/current/apidocs/
+:source-indent: 0
+:tabsize: 2
 
 Spring Security is a powerful and highly customizable authentication and access-control framework.
 It is the de-facto standard for securing Spring-based applications.
 
-include::{include-dir}/preface/index.adoc[]
 
-include::{include-dir}/architecture/index.adoc[]
+include::{include-dir}/servlet/index.adoc[]
 
-include::{include-dir}/test/index.adoc[]
-
-include::{include-dir}/web/index.adoc[]
-
-include::{include-dir}/authorization/index.adoc[]
-
-include::{include-dir}/additional-topics/index.adoc[]
-
-include::{include-dir}/data/index.adoc[]
-
-include::{include-dir}/appendix/index.adoc[]
+include::{include-dir}/reactive/index.adoc[]