Browse Source

Add ProviderManager to Reference

Closes gh-8029
Rob Winch 5 years ago
parent
commit
d009a7b1de

+ 1 - 2
docs/manual/src/docs/asciidoc/_includes/servlet/appendix/namespace.adoc

@@ -2039,8 +2039,7 @@ Its use is described in the <<ns-auth-manager,namespace introduction>>.
 [[nsa-authentication-manager-erase-credentials]]
 [[nsa-authentication-manager-erase-credentials]]
 * **erase-credentials**
 * **erase-credentials**
 If set to true, the AuthenticationManager will attempt to clear any credentials data in the returned Authentication object, once the user has been authenticated.
 If set to true, the AuthenticationManager will attempt to clear any credentials data in the returned Authentication object, once the user has been authenticated.
-Literally it maps to the `eraseCredentialsAfterAuthentication` property of the `ProviderManager`.
-This is discussed in the <<core-services-erasing-credentials,Core Services>> chapter.
+Literally it maps to the `eraseCredentialsAfterAuthentication` property of the <<servlet-authentication-providermanager,`ProviderManager`>>.
 
 
 
 
 [[nsa-authentication-manager-id]]
 [[nsa-authentication-manager-id]]

+ 1 - 58
docs/manual/src/docs/asciidoc/_includes/servlet/architecture/core-services.adoc

@@ -3,65 +3,8 @@
 Now that we have a high-level overview of the Spring Security architecture and its core classes, let's take a closer look at one or two of the core interfaces and their implementations, in particular the `AuthenticationManager`, `UserDetailsService` and the `AccessDecisionManager`.
 Now that we have a high-level overview of the Spring Security architecture and its core classes, let's take a closer look at one or two of the core interfaces and their implementations, in particular the `AuthenticationManager`, `UserDetailsService` and the `AccessDecisionManager`.
 These crop up regularly throughout the remainder of this document so it's important you know how they are configured and how they operate.
 These crop up regularly throughout the remainder of this document so it's important you know how they are configured and how they operate.
 
 
-
-[[core-services-authentication-manager]]
-=== The AuthenticationManager, ProviderManager and AuthenticationProvider
-The `AuthenticationManager` is just an interface, so the implementation can be anything we choose, but how does it work in practice? What if we need to check multiple authentication databases or a combination of different authentication services such as a database and an LDAP server?
-
-The default implementation in Spring Security is called `ProviderManager` and rather than handling the authentication request itself, it delegates to a list of configured `AuthenticationProvider` s, each of which is queried in turn to see if it can perform the authentication.
-Each provider will either throw an exception or return a fully populated `Authentication` object.
-Remember our good friends, `UserDetails` and `UserDetailsService`? If not, head back to the previous chapter and refresh your memory.
-The most common approach to verifying an authentication request is to load the corresponding `UserDetails` and check the loaded password against the one that has been entered by the user.
-This is the approach used by the `DaoAuthenticationProvider` (see below).
-The loaded `UserDetails` object - and particularly the `GrantedAuthority` s it contains - will be used when building the fully populated `Authentication` object which is returned from a successful authentication and stored in the `SecurityContext`.
-
-If you are using the namespace, an instance of `ProviderManager` is created and maintained internally, and you add providers to it by using the namespace authentication provider elements (see <<ns-auth-manager,the namespace chapter>>).
-In this case, you should not declare a `ProviderManager` bean in your application context.
-However, if you are not using the namespace then you would declare it like so:
-
-[source,xml]
-----
-
-<bean id="authenticationManager"
-		class="org.springframework.security.authentication.ProviderManager">
-	<constructor-arg>
-		<list>
-			<ref local="daoAuthenticationProvider"/>
-			<ref local="anonymousAuthenticationProvider"/>
-			<ref local="ldapAuthenticationProvider"/>
-		</list>
-	</constructor-arg>
-</bean>
-----
-
-In the above example we have three providers.
-They are tried in the order shown (which is implied by the use of a `List`), with each provider able to attempt authentication, or skip authentication by simply returning `null`.
-If all implementations return null, the `ProviderManager` will throw a `ProviderNotFoundException`.
-If you're interested in learning more about chaining providers, please refer to the `ProviderManager` Javadoc.
-
-Authentication mechanisms such as a web form-login processing filter are injected with a reference to the `ProviderManager` and will call it to handle their authentication requests.
-The providers you require will sometimes be interchangeable with the authentication mechanisms, while at other times they will depend on a specific authentication mechanism.
-For example, `DaoAuthenticationProvider` and `LdapAuthenticationProvider` are compatible with any mechanism which submits a simple username/password authentication request and so will work with form-based logins or HTTP Basic authentication.
-On the other hand, some authentication mechanisms create an authentication request object which can only be interpreted by a single type of `AuthenticationProvider`.
-An example of this would be JA-SIG CAS, which uses the notion of a service ticket and so can therefore only be authenticated by a `CasAuthenticationProvider`.
-You needn't be too concerned about this, because if you forget to register a suitable provider, you'll simply receive a `ProviderNotFoundException` when an attempt to authenticate is made.
-
-
-[[core-services-erasing-credentials]]
-==== Erasing Credentials on Successful Authentication
-By default (from Spring Security 3.1 onwards) the `ProviderManager` will attempt to clear any sensitive credentials information from the `Authentication` object which is returned by a successful authentication request.
-This prevents information like passwords being retained longer than necessary.
-
-This may cause issues when you are using a cache of user objects, for example, to improve performance in a stateless application.
-If the `Authentication` contains a reference to an object in the cache (such as a `UserDetails` instance) and this has its credentials removed, then it will no longer be possible to authenticate against the cached value.
-You need to take this into account if you are using a cache.
-An obvious solution is to make a copy of the object first, either in the cache implementation or in the `AuthenticationProvider` which creates the returned `Authentication` object.
-Alternatively, you can disable the `eraseCredentialsAfterAuthentication` property on `ProviderManager`.
-See the Javadoc for more information.
-
-
 [[core-services-dao-provider]]
 [[core-services-dao-provider]]
-==== DaoAuthenticationProvider
+=== DaoAuthenticationProvider
 The simplest `AuthenticationProvider` implemented by Spring Security is `DaoAuthenticationProvider`, which is also one of the earliest supported by the framework.
 The simplest `AuthenticationProvider` implemented by Spring Security is `DaoAuthenticationProvider`, which is also one of the earliest supported by the framework.
 It leverages a `UserDetailsService` (as a DAO) in order to lookup the username, password and `GrantedAuthority` s.
 It leverages a `UserDetailsService` (as a DAO) in order to lookup the username, password and `GrantedAuthority` s.
 It authenticates the user simply by comparing the password submitted in a `UsernamePasswordAuthenticationToken` against the one loaded by the `UserDetailsService`.
 It authenticates the user simply by comparing the password submitted in a `UsernamePasswordAuthenticationToken` against the one loaded by the `UserDetailsService`.

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

@@ -1,5 +1,6 @@
 [[servlet-architecture]]
 [[servlet-architecture]]
 = Architecture and Implementation
 = Architecture and Implementation
+// FIXME: change to something like Servlet Security: The Big Picture
 :figures: images/servlet/architecture
 :figures: images/servlet/architecture
 
 
 This section discusses Spring Security's high level architecture within Servlet based applications.
 This section discusses Spring Security's high level architecture within Servlet based applications.

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

@@ -42,7 +42,7 @@ Remember the advantage that whatever your `UserDetailsService` returns can alway
 There is often some confusion about `UserDetailsService`.
 There is often some confusion about `UserDetailsService`.
 It is purely a DAO for user data and performs no other function other than to supply that data to other components within the framework.
 It is purely a DAO for user data and performs no other function other than to supply that data to other components within the framework.
 In particular, it __does not__ authenticate the user, which is done by the `AuthenticationManager`.
 In particular, it __does not__ authenticate the user, which is done by the `AuthenticationManager`.
-In many cases it makes more sense to <<core-services-authentication-manager,implement `AuthenticationProvider`>> directly if you require a custom authentication process.
+In many cases it makes more sense to implement `AuthenticationProvider` directly if you require a custom authentication process.
 
 
 ====
 ====
 
 
@@ -188,7 +188,7 @@ All you need to do is write a filter (or equivalent) that reads the third-party
 In this case you also need to think about things which are normally taken care of automatically by the built-in authentication infrastructure.
 In this case you also need to think about things which are normally taken care of automatically by the built-in authentication infrastructure.
 For example, you might need to pre-emptively create an HTTP session to <<tech-intro-sec-context-persistence,cache the context between requests>>, before you write the response to the client footnote:[It isn't possible to create a session once the response has been committed.].
 For example, you might need to pre-emptively create an HTTP session to <<tech-intro-sec-context-persistence,cache the context between requests>>, before you write the response to the client footnote:[It isn't possible to create a session once the response has been committed.].
 
 
-If you're wondering how the `AuthenticationManager` is implemented in a real world example, we'll look at that in the <<core-services-authentication-manager,core services chapter>>.
+If you're wondering how the `AuthenticationManager` is implemented in a real world example, we'll look at that in the <<servlet-authentication-authenticationmanager,`AuthenticationManager`>>.
 
 
 
 
 [[tech-intro-web-authentication]]
 [[tech-intro-web-authentication]]

+ 1 - 1
docs/manual/src/docs/asciidoc/_includes/servlet/authentication/architecture/authentication-manager.adoc

@@ -5,6 +5,6 @@
 The `Authentication` that is returned is then set on the <<servlet-authentication-securitycontextholder>>.
 The `Authentication` that is returned is then set on the <<servlet-authentication-securitycontextholder>>.
 If you are not integrating with <<servlet-filterchainproxy,Spring Security's ``Filters``s>>, you can set the `SecurityContextHolder` directly and are not required to use an `AuthenticationManager`.
 If you are not integrating with <<servlet-filterchainproxy,Spring Security's ``Filters``s>>, you can set the `SecurityContextHolder` directly and are not required to use an `AuthenticationManager`.
 
 
-While the implementation of `AuthenticationManager` could be anything, Spring Security provides `ProviderManager` which allows users to provide multiple `AuthenticationProvider` implementations.
+While the implementation of `AuthenticationManager` could be anything, the most common implementation is <<servlet-authentication-providermanager,`ProviderManager`>>.
 // FIXME: link to ProviderManager
 // FIXME: link to ProviderManager
 // FIXME: add configuration
 // FIXME: add configuration

+ 1 - 3
docs/manual/src/docs/asciidoc/_includes/servlet/authentication/architecture/index.adoc

@@ -12,9 +12,7 @@ include::abstract-authentication-processing-filter.adoc[leveloffset=+1]
 
 
 include::authentication-manager.adoc[leveloffset=+1]
 include::authentication-manager.adoc[leveloffset=+1]
 
 
-// authenticationmanager
-
-// providermanager
+include::provider-manager.adoc[leveloffset=+1]
 
 
 // authenticationprovider
 // authenticationprovider
 
 

+ 36 - 0
docs/manual/src/docs/asciidoc/_includes/servlet/authentication/architecture/provider-manager.adoc

@@ -0,0 +1,36 @@
+[[servlet-authentication-providermanager]]
+= ProviderManager
+:figures: images/servlet/authentication/architecture
+
+{security-api-url}org/springframework/security/authentication/ProviderManager.html[`ProviderManager`] is the most commonly used implementation of <<servlet-authentication-authenticationmanager,`AuthenticationManager`>>.
+`ProviderManager` delegates to a `List` of ``AuthenticationProvider``s.
+// FIXME: link to AuthenticationProvider
+Each `AuthenticationProvider` has an opportunity to indicate that authentication should be successful, fail, or indicate it cannot make a decision and allow a downstream `AuthenticationProvider` to decide.
+If none of the configured ``AuthenticationProvider``s can authenticate, then authentication will fail with a `ProviderNotFoundException` which is a special `AuthenticationException` that indicates the `ProviderManager` was not configured support the type of `Authentication` that was passed into it.
+
+image::{figures}/providermanager.png[]
+
+In practice each `AuthenticationProvider` knows how to perform a specific type of authentication.
+ For example, one `AuthenticationProvider` might be able to validate a username/password, while another might be able to authenticate a SAML assertion.
+This allows each `AuthenticationProvider` to do a very specific type of authentication, while supporting multiple types of authentication and only exposing a single `AuthenticationManager` bean.
+
+`ProviderManager` also allows configuring an optional parent `AuthenticationManager` which is consulted in the event that no `AuthenticationProvider` can perform authentication.
+The parent can be any type of `AuthenticationManager`, but it is often an instance of `ProviderManager`.
+
+image::{figures}/providermanager-parent.png[]
+
+In fact, multiple `ProviderManager` instances might share the same parent `AuthenticationManager`.
+This is somewhat common in scenarios where there are multiple <<servlet-securityfilterchain,`SecurityFilterChain`>> instances that have some authentication in common (the shared parent `AuthenticationManager`), but also different authentication mechanisms (the different `ProviderManager` instances).
+
+image::{figures}/providermanagers-parent.png[]
+
+[[servlet-authentication-providermanager-erasing-credentials]]
+By default `ProviderManager` will attempt to clear any sensitive credentials information from the `Authentication` object which is returned by a successful authentication request.
+This prevents information like passwords being retained longer than necessary in the `HttpSession`.
+
+This may cause issues when you are using a cache of user objects, for example, to improve performance in a stateless application.
+If the `Authentication` contains a reference to an object in the cache (such as a `UserDetails` instance) and this has its credentials removed, then it will no longer be possible to authenticate against the cached value.
+You need to take this into account if you are using a cache.
+An obvious solution is to make a copy of the object first, either in the cache implementation or in the `AuthenticationProvider` which creates the returned `Authentication` object.
+Alternatively, you can disable the `eraseCredentialsAfterAuthentication` property on `ProviderManager`.
+See the {security-api-url}org/springframework/security/authentication/ProviderManager.html[Javadoc] for more information.

+ 10 - 1
docs/manual/src/docs/asciidoc/_includes/servlet/authentication/index.adoc

@@ -7,16 +7,25 @@ This section discusses:
 [[servlet-authentication-architecture]]
 [[servlet-authentication-architecture]]
 *Architecture Components*
 *Architecture Components*
 
 
+This section describes the main architectural components of Spring Security's used in Servlet authentication.
+If you need concrete flows that explain how these pieces fit together, look in specific sections.
+// FIXME: add for example see form login if you want to see more concrete flows.
+
 * <<servlet-authentication-securitycontextholder>> - The `SecurityContextHolder` is where Spring Security stores the details of who is <<authentication,authenticated>>.
 * <<servlet-authentication-securitycontextholder>> - The `SecurityContextHolder` is where Spring Security stores the details of who is <<authentication,authenticated>>.
 * <<servlet-authentication-securitycontext>> - is obtained from the `SecurityContextHolder` and contains the `Authentication` of the currently authenticated user.
 * <<servlet-authentication-securitycontext>> - is obtained from the `SecurityContextHolder` and contains the `Authentication` of the currently authenticated user.
 * <<servlet-authentication-authentication>> - Can be the input to `AuthenticationManager` to provide the credentials a user has provided to authenticate or the current user from the `SecurityContext`.
 * <<servlet-authentication-authentication>> - Can be the input to `AuthenticationManager` to provide the credentials a user has provided to authenticate or the current user from the `SecurityContext`.
 * <<servlet-authentication-granted-authority>> - An authority that is granted to the principal on the `Authentication` (i.e. roles, scopes, etc.)
 * <<servlet-authentication-granted-authority>> - An authority that is granted to the principal on the `Authentication` (i.e. roles, scopes, etc.)
 * <<servlet-authentication-authenticationentrypoint>> - used for requesting credentials from a client (i.e. redirecting to a log in page, sending a `WWW-Authenticate` response, etc.)
 * <<servlet-authentication-authenticationentrypoint>> - used for requesting credentials from a client (i.e. redirecting to a log in page, sending a `WWW-Authenticate` response, etc.)
-* <<servlet-authentication-abstractprocessingfilter>> - a base `Filter` used for authentication
+* <<servlet-authentication-abstractprocessingfilter>> - a base `Filter` used for authentication.
+This also gives a good idea of the high level flow of authentication and how pieces work together.
 * <<servlet-authentication-authenticationmanager>> -  the API that defines how Spring Security's Filters perform  <<authentication,authentication>>.
 * <<servlet-authentication-authenticationmanager>> -  the API that defines how Spring Security's Filters perform  <<authentication,authentication>>.
+* <<servlet-authentication-providermanager>> -  the most common implementation of `AuthenticationManager`.
 
 
+[[servlet-authentication-mechanisms]]
 *Authentication Mechanisms*
 *Authentication Mechanisms*
 
 
+// FIXME: brief description
+
 * <<servlet-authentication-unpwd>> - how to authenticate with a username/password
 * <<servlet-authentication-unpwd>> - how to authenticate with a username/password
 // FIXME: Add other mechanisms
 // FIXME: Add other mechanisms
 
 

BIN
docs/manual/src/docs/asciidoc/images/servlet/authentication/architecture/providermanager-parent.odg


BIN
docs/manual/src/docs/asciidoc/images/servlet/authentication/architecture/providermanager-parent.png


BIN
docs/manual/src/docs/asciidoc/images/servlet/authentication/architecture/providermanager.odg


BIN
docs/manual/src/docs/asciidoc/images/servlet/authentication/architecture/providermanager.png


BIN
docs/manual/src/docs/asciidoc/images/servlet/authentication/architecture/providermanagers-parent.odg


BIN
docs/manual/src/docs/asciidoc/images/servlet/authentication/architecture/providermanagers-parent.png