Class ProviderManager
- All Implemented Interfaces:
org.springframework.beans.factory.Aware,org.springframework.beans.factory.InitializingBean,org.springframework.context.MessageSourceAware,AuthenticationManager
Authentication request through a list of
AuthenticationProviders.
AuthenticationProviders are usually tried in order until one provides a
non-null response. A non-null response indicates the provider had authority to decide
on the authentication request and no further providers are tried. If a subsequent
provider successfully authenticates the request, the earlier authentication exception
is disregarded and the successful authentication will be used. If no subsequent
provider provides a non-null response, or a new AuthenticationException,
the last AuthenticationException received will be used. If no provider
returns a non-null response, or indicates it can even process an
Authentication, the ProviderManager will throw a
ProviderNotFoundException. A parent AuthenticationManager can also
be set, and this will also be tried if none of the configured providers can perform the
authentication. This is intended to support namespace configuration options though and
is not a feature that should normally be required.
The exception to this process is when a provider throws an
AccountStatusException, in which case no further providers in the list will be
queried.
Post-authentication, the credentials will be cleared from the returned
Authentication object, if it implements the CredentialsContainer
interface. This behaviour can be controlled by modifying the
eraseCredentialsAfterAuthentication property.
Event Publishing
Authentication event publishing is delegated to the configured
AuthenticationEventPublisher which defaults to a null implementation which
doesn't publish events, so if you are configuring the bean yourself you must inject a
publisher bean if you want to receive events. The standard implementation is
DefaultAuthenticationEventPublisher which maps common exceptions to events (in
the case of authentication failure) and publishes an
AuthenticationSuccessEvent if authentication succeeds. If you are using the namespace
then an instance of this bean will be used automatically by the <http>
configuration, so you will receive events from the web part of your application
automatically.
Note that the implementation also publishes authentication failure events when it
obtains an authentication result (or an exception) from the "parent"
AuthenticationManager if one has been set. So in this situation, the parent
should not generally be configured to publish events or there will be duplicates.
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected org.springframework.context.support.MessageSourceAccessor -
Constructor Summary
ConstructorsConstructorDescriptionProviderManager(List<AuthenticationProvider> providers) Construct aProviderManagerusing the givenAuthenticationProvidersProviderManager(List<AuthenticationProvider> providers, @Nullable AuthenticationManager parent) Construct aProviderManagerusing the provided parametersProviderManager(AuthenticationProvider... providers) Construct aProviderManagerusing the givenAuthenticationProviders -
Method Summary
Modifier and TypeMethodDescriptionvoidauthenticate(Authentication authentication) Attempts to authenticate the passedAuthenticationobject.booleanvoidsetAuthenticationEventPublisher(AuthenticationEventPublisher eventPublisher) voidsetEraseCredentialsAfterAuthentication(boolean eraseSecretData) If set to, a resultingAuthenticationwhich implements theCredentialsContainerinterface will have itseraseCredentialsmethod called before it is returned from theauthenticate()method.voidsetMessageSource(org.springframework.context.MessageSource messageSource)
-
Field Details
-
messages
protected org.springframework.context.support.MessageSourceAccessor messages
-
-
Constructor Details
-
ProviderManager
Construct aProviderManagerusing the givenAuthenticationProviders- Parameters:
providers- theAuthenticationProviders to use
-
ProviderManager
Construct aProviderManagerusing the givenAuthenticationProviders- Parameters:
providers- theAuthenticationProviders to use
-
ProviderManager
public ProviderManager(List<AuthenticationProvider> providers, @Nullable AuthenticationManager parent) Construct aProviderManagerusing the provided parameters- Parameters:
providers- theAuthenticationProviders to useparent- a parentAuthenticationManagerto fall back to
-
-
Method Details
-
afterPropertiesSet
public void afterPropertiesSet()- Specified by:
afterPropertiesSetin interfaceorg.springframework.beans.factory.InitializingBean
-
authenticate
Attempts to authenticate the passedAuthenticationobject.The list of
AuthenticationProviders will be successively tried until anAuthenticationProviderindicates it is capable of authenticating the type ofAuthenticationobject passed. Authentication will then be attempted with thatAuthenticationProvider.If more than one
AuthenticationProvidersupports the passedAuthenticationobject, the first one able to successfully authenticate theAuthenticationobject determines theresult, overriding any possibleAuthenticationExceptionthrown by earlier supportingAuthenticationProviders. On successful authentication, no subsequentAuthenticationProviders will be tried. If authentication was not successful by any supportingAuthenticationProviderthe last thrownAuthenticationExceptionwill be rethrown.- Specified by:
authenticatein interfaceAuthenticationManager- Parameters:
authentication- the authentication request object.- Returns:
- a fully authenticated object including credentials.
- Throws:
AuthenticationException- if authentication fails.
-
getProviders
-
setMessageSource
public void setMessageSource(org.springframework.context.MessageSource messageSource) - Specified by:
setMessageSourcein interfaceorg.springframework.context.MessageSourceAware
-
setAuthenticationEventPublisher
-
setEraseCredentialsAfterAuthentication
public void setEraseCredentialsAfterAuthentication(boolean eraseSecretData) If set to, a resultingAuthenticationwhich implements theCredentialsContainerinterface will have itseraseCredentialsmethod called before it is returned from theauthenticate()method.- Parameters:
eraseSecretData- set to false to retain the credentials data in memory. Defaults to true.
-
isEraseCredentialsAfterAuthentication
public boolean isEraseCredentialsAfterAuthentication()
-