public abstract class

AbstractUserDetailsAuthenticationProvider

extends Object
implements InitializingBean MessageSourceAware AuthenticationProvider
java.lang.Object
   ↳ org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider
Known Direct Subclasses

Class Overview

A base AuthenticationProvider that allows subclasses to override and work with UserDetails objects. The class is designed to respond to UsernamePasswordAuthenticationToken authentication requests.

Upon successful validation, a UsernamePasswordAuthenticationToken will be created and returned to the caller. The token will include as its principal either a String representation of the username, or the UserDetails that was returned from the authentication repository. Using String is appropriate if a container adapter is being used, as it expects String representations of the username. Using UserDetails is appropriate if you require access to additional properties of the authenticated user, such as email addresses, human-friendly names etc. As container adapters are not recommended to be used, and UserDetails implementations provide additional flexibility, by default a UserDetails is returned. To override this default, set the setForcePrincipalAsString(boolean) to true.

Caching is handled by storing the UserDetails object being placed in the UserCache. This ensures that subsequent requests with the same username can be validated without needing to query the UserDetailsService. It should be noted that if a user appears to present an incorrect password, the UserDetailsService will be queried to confirm the most up-to-date password was used for comparison. Caching is only likely to be required for stateless applications. In a normal web application, for example, the SecurityContext is stored in the user's session and the user isn't reauthenticated on each request. The default cache implementation is therefore NullUserCache.

Summary

Fields
protected boolean hideUserNotFoundExceptions
protected final Log logger
protected MessageSourceAccessor messages
Public Constructors
AbstractUserDetailsAuthenticationProvider()
Public Methods
final void afterPropertiesSet()
Authentication authenticate(Authentication authentication)
Performs authentication with the same contract as authenticate(Authentication).
UserCache getUserCache()
boolean isForcePrincipalAsString()
boolean isHideUserNotFoundExceptions()
void setAuthoritiesMapper(GrantedAuthoritiesMapper authoritiesMapper)
void setForcePrincipalAsString(boolean forcePrincipalAsString)
void setHideUserNotFoundExceptions(boolean hideUserNotFoundExceptions)
By default the AbstractUserDetailsAuthenticationProvider throws a BadCredentialsException if a username is not found or the password is incorrect.
void setMessageSource(MessageSource messageSource)
void setPostAuthenticationChecks(UserDetailsChecker postAuthenticationChecks)
void setPreAuthenticationChecks(UserDetailsChecker preAuthenticationChecks)
Sets the policy will be used to verify the status of the loaded UserDetails before validation of the credentials takes place.
void setUserCache(UserCache userCache)
boolean supports(Class<?> authentication)
Returns true if this AuthenticationProvider supports the indicated Authentication object.
Protected Methods
abstract void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication)
Allows subclasses to perform any additional checks of a returned (or cached) UserDetails for a given authentication request.
Authentication createSuccessAuthentication(Object principal, Authentication authentication, UserDetails user)
Creates a successful Authentication object.
void doAfterPropertiesSet()
UserDetailsChecker getPostAuthenticationChecks()
UserDetailsChecker getPreAuthenticationChecks()
abstract UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken authentication)
Allows subclasses to actually retrieve the UserDetails from an implementation-specific location, with the option of throwing an AuthenticationException immediately if the presented credentials are incorrect (this is especially useful if it is necessary to bind to a resource as the user in order to obtain or generate a UserDetails).
[Expand]
Inherited Methods
From class java.lang.Object
From interface org.springframework.beans.factory.InitializingBean
From interface org.springframework.context.MessageSourceAware
From interface org.springframework.security.authentication.AuthenticationProvider

Fields

protected boolean hideUserNotFoundExceptions

protected final Log logger

protected MessageSourceAccessor messages

Public Constructors

public AbstractUserDetailsAuthenticationProvider ()

Public Methods

public final void afterPropertiesSet ()

Throws
Exception

public Authentication authenticate (Authentication authentication)

Performs authentication with the same contract as authenticate(Authentication).

Parameters
authentication the authentication request object.
Returns
  • a fully authenticated object including credentials. May return null if the AuthenticationProvider is unable to support authentication of the passed Authentication object. In such a case, the next AuthenticationProvider that supports the presented Authentication class will be tried.

public UserCache getUserCache ()

public boolean isForcePrincipalAsString ()

public boolean isHideUserNotFoundExceptions ()

public void setAuthoritiesMapper (GrantedAuthoritiesMapper authoritiesMapper)

public void setForcePrincipalAsString (boolean forcePrincipalAsString)

public void setHideUserNotFoundExceptions (boolean hideUserNotFoundExceptions)

By default the AbstractUserDetailsAuthenticationProvider throws a BadCredentialsException if a username is not found or the password is incorrect. Setting this property to false will cause UsernameNotFoundExceptions to be thrown instead for the former. Note this is considered less secure than throwing BadCredentialsException for both exceptions.

Parameters
hideUserNotFoundExceptions set to false if you wish UsernameNotFoundExceptions to be thrown instead of the non-specific BadCredentialsException (defaults to true)

public void setMessageSource (MessageSource messageSource)

public void setPostAuthenticationChecks (UserDetailsChecker postAuthenticationChecks)

public void setPreAuthenticationChecks (UserDetailsChecker preAuthenticationChecks)

Sets the policy will be used to verify the status of the loaded UserDetails before validation of the credentials takes place.

Parameters
preAuthenticationChecks strategy to be invoked prior to authentication.

public void setUserCache (UserCache userCache)

public boolean supports (Class<?> authentication)

Returns true if this AuthenticationProvider supports the indicated Authentication object.

Returning true does not guarantee an AuthenticationProvider will be able to authenticate the presented instance of the Authentication class. It simply indicates it can support closer evaluation of it. An AuthenticationProvider can still return null from the authenticate(Authentication) method to indicate another AuthenticationProvider should be tried.

Selection of an AuthenticationProvider capable of performing authentication is conducted at runtime the ProviderManager.

Returns
  • true if the implementation can more closely evaluate the Authentication class presented

Protected Methods

protected abstract void additionalAuthenticationChecks (UserDetails userDetails, UsernamePasswordAuthenticationToken authentication)

Allows subclasses to perform any additional checks of a returned (or cached) UserDetails for a given authentication request. Generally a subclass will at least compare the getCredentials() with a getPassword(). If custom logic is needed to compare additional properties of UserDetails and/or UsernamePasswordAuthenticationToken, these should also appear in this method.

Parameters
userDetails as retrieved from the retrieveUser(String, UsernamePasswordAuthenticationToken) or UserCache
authentication the current request that needs to be authenticated
Throws
AuthenticationException AuthenticationException if the credentials could not be validated (generally a BadCredentialsException, an AuthenticationServiceException)

protected Authentication createSuccessAuthentication (Object principal, Authentication authentication, UserDetails user)

Creates a successful Authentication object.

Protected so subclasses can override.

Subclasses will usually store the original credentials the user supplied (not salted or encoded passwords) in the returned Authentication object.

Parameters
principal that should be the principal in the returned object (defined by the isForcePrincipalAsString() method)
authentication that was presented to the provider for validation
user that was loaded by the implementation
Returns
  • the successful authentication token

protected void doAfterPropertiesSet ()

Throws
Exception

protected UserDetailsChecker getPostAuthenticationChecks ()

protected UserDetailsChecker getPreAuthenticationChecks ()

protected abstract UserDetails retrieveUser (String username, UsernamePasswordAuthenticationToken authentication)

Allows subclasses to actually retrieve the UserDetails from an implementation-specific location, with the option of throwing an AuthenticationException immediately if the presented credentials are incorrect (this is especially useful if it is necessary to bind to a resource as the user in order to obtain or generate a UserDetails).

Subclasses are not required to perform any caching, as the AbstractUserDetailsAuthenticationProvider will by default cache the UserDetails. The caching of UserDetails does present additional complexity as this means subsequent requests that rely on the cache will need to still have their credentials validated, even if the correctness of credentials was assured by subclasses adopting a binding-based strategy in this method. Accordingly it is important that subclasses either disable caching (if they want to ensure that this method is the only method that is capable of authenticating a request, as no UserDetails will ever be cached) or ensure subclasses implement additionalAuthenticationChecks(UserDetails, UsernamePasswordAuthenticationToken) to compare the credentials of a cached UserDetails with subsequent authentication requests.

Most of the time subclasses will not perform credentials inspection in this method, instead performing it in additionalAuthenticationChecks(UserDetails, UsernamePasswordAuthenticationToken) so that code related to credentials validation need not be duplicated across two methods.

Parameters
username The username to retrieve
authentication The authentication request, which subclasses may need to perform a binding-based retrieval of the UserDetails
Returns
  • the user information (never null - instead an exception should the thrown)
Throws
AuthenticationException if the credentials could not be validated (generally a BadCredentialsException, an AuthenticationServiceException or UsernameNotFoundException)