Spring Security Web module provides comprehensive security services and servlet integration for web applications built with the Spring Framework
Authentication filters handle various authentication mechanisms including form login, HTTP Basic, remember-me, one-time tokens, and pre-authentication.
Required Dependencies:
spring-security-web (this package)spring-security-core is required (provides AuthenticationManager, Authentication, AuthenticationException)spring-security-config is required for HttpSecurity DSL configurationUserDetailsService required for remember-me and form login (from spring-security-core)DataSource required for persistent remember-me tokens (JdbcTokenRepositoryImpl)spring-security-ott module required (OneTimeTokenService)Default Behaviors:
/login (POST), username parameter "username", password parameter "password"UsernamePasswordAuthenticationFilter: postOnly=true (only processes POST requests)AuthenticationFilter: Requires RequestMatcher to determine which requests to processSavedRequestAwareAuthenticationSuccessHandler (uses RequestCache for redirect)SimpleUrlAuthenticationFailureHandler (redirects to failure URL)"remember-me", token validity 1209600 seconds (2 weeks)"anonymousUser", key required for token generationcontinueChainBeforeSuccessfulAuthentication=false (filter chain stops after authentication by default)Threading Model:
AuthenticationManager.authenticate() may block (depends on provider implementation)Lifecycle:
OncePerRequestFilter or GenericFilterBean (Spring lifecycle aware)afterPropertiesSet() validates required dependencies (AuthenticationManager, etc.)autoLogin() called on every request (if no authentication present)alwaysRemember=true)onAuthentication() called after successful authenticationExceptions:
BadCredentialsException - Invalid username/passwordAccountExpiredException - User account has expiredCredentialsExpiredException - User credentials have expiredDisabledException - User account is disabledLockedException - User account is lockedRememberMeAuthenticationException - Remember-me authentication failures (CookieTheftException, InvalidCookieException)NonceExpiredException - Digest authentication nonce expiredAuthenticationServiceException - Authentication service failures (wrapped exceptions)ServletException, IOException - Servlet API exceptionsEdge Cases:
AuthenticationConverter returns null: No authentication attempt made (filter chain continues)CookieTheftException (all user tokens invalidated)exceptionIfHeaderMissing=false if header may be absentSwitchUserGrantedAuthority (can retrieve via getSource())setMfaEnabled(true) allows multi-factor authentication flowscontinueChainBeforeSuccessfulAuthentication=true: Filter chain continues after authentication (rare use case)Generic authentication filter that uses AuthenticationConverter and AuthenticationManager.
package org.springframework.security.web.authentication;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.util.matcher.RequestMatcher;
import org.springframework.web.filter.OncePerRequestFilter;
public class AuthenticationFilter extends OncePerRequestFilter {
/**
* Creates an authentication filter.
*
* @param authenticationManager the authentication manager
* @param authenticationConverter converts requests to Authentication
*/
public AuthenticationFilter(AuthenticationManager authenticationManager,
AuthenticationConverter authenticationConverter);
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException;
public RequestMatcher getRequestMatcher();
public void setRequestMatcher(RequestMatcher requestMatcher);
public AuthenticationConverter getAuthenticationConverter();
public void setAuthenticationConverter(AuthenticationConverter authenticationConverter);
public AuthenticationSuccessHandler getSuccessHandler();
public void setSuccessHandler(AuthenticationSuccessHandler successHandler);
public AuthenticationFailureHandler getFailureHandler();
public void setFailureHandler(AuthenticationFailureHandler failureHandler);
/**
* Enables multi-factor authentication support.
*/
public void setMfaEnabled(boolean mfaEnabled);
}Strategy for converting HttpServletRequest to Authentication.
package org.springframework.security.web.authentication;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.security.core.Authentication;
public interface AuthenticationConverter {
/**
* Converts the request to an Authentication for processing.
* Returns null if no authentication attempt should be made.
*
* @param request the HttpServletRequest
* @return Authentication or null
*/
Authentication convert(HttpServletRequest request);
}Delegates to multiple AuthenticationConverter implementations in order.
package org.springframework.security.web.authentication;
import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
import org.springframework.security.core.Authentication;
public class DelegatingAuthenticationConverter implements AuthenticationConverter {
/**
* Creates a delegating converter with the given converters.
*
* @param converters the list of authentication converters
* @since 5.2
*/
public DelegatingAuthenticationConverter(List<AuthenticationConverter> converters);
/**
* Attempts to convert using each converter in order until one returns a non-null result.
*/
public Authentication convert(HttpServletRequest request);
}Base class for authentication filters that process authentication requests.
package org.springframework.security.web.authentication;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.util.matcher.RequestMatcher;
import org.springframework.web.filter.GenericFilterBean;
public abstract class AbstractAuthenticationProcessingFilter extends GenericFilterBean {
/**
* Creates a filter with the given authentication manager and URL pattern.
*
* @param defaultFilterProcessesUrl the URL pattern to process
*/
protected AbstractAuthenticationProcessingFilter(String defaultFilterProcessesUrl);
/**
* Creates a filter with the given authentication manager and request matcher.
*
* @param requiresAuthenticationRequestMatcher the request matcher
*/
protected AbstractAuthenticationProcessingFilter(RequestMatcher requiresAuthenticationRequestMatcher);
/**
* Creates a filter with authentication manager and request matcher.
*
* @param requiresAuthenticationRequestMatcher the request matcher
* @param authenticationManager the authentication manager
*/
protected AbstractAuthenticationProcessingFilter(RequestMatcher requiresAuthenticationRequestMatcher,
AuthenticationManager authenticationManager);
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;
/**
* Performs the actual authentication. Must be implemented by subclasses.
*
* @param request the HTTP request
* @param response the HTTP response
* @return the authenticated user token
* @throws AuthenticationException if authentication fails
*/
public abstract Authentication attemptAuthentication(HttpServletRequest request,
HttpServletResponse response)
throws AuthenticationException, IOException, ServletException;
/**
* Sets the authentication manager.
*/
public void setAuthenticationManager(AuthenticationManager authenticationManager);
/**
* Sets the success handler.
*/
public void setAuthenticationSuccessHandler(AuthenticationSuccessHandler successHandler);
/**
* Sets the failure handler.
*/
public void setAuthenticationFailureHandler(AuthenticationFailureHandler failureHandler);
/**
* Sets the session authentication strategy.
*/
public void setSessionAuthenticationStrategy(SessionAuthenticationStrategy sessionStrategy);
/**
* Sets whether to continue the filter chain after successful authentication.
* Default: false (filter chain stops after authentication).
*/
public void setContinueChainBeforeSuccessfulAuthentication(boolean continueChainBeforeSuccessfulAuthentication);
/**
* Sets the authentication details source.
*/
public void setAuthenticationDetailsSource(
AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource);
/**
* Sets the RememberMeServices.
*/
public void setRememberMeServices(RememberMeServices rememberMeServices);
/**
* Sets the SecurityContextRepository.
*/
public void setSecurityContextRepository(SecurityContextRepository securityContextRepository);
/**
* Sets the SecurityContextHolderStrategy.
*/
public void setSecurityContextHolderStrategy(SecurityContextHolderStrategy securityContextHolderStrategy);
public void afterPropertiesSet();
}Strategy for handling successful authentication.
package org.springframework.security.web.authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.core.Authentication;
public interface AuthenticationSuccessHandler {
/**
* Called when authentication succeeds.
*
* @param request the request
* @param response the response
* @param authentication the authenticated user
*/
void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException;
}Strategy for handling failed authentication.
package org.springframework.security.web.authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.core.AuthenticationException;
public interface AuthenticationFailureHandler {
/**
* Called when authentication fails.
*
* @param request the request
* @param response the response
* @param exception the authentication exception
*/
void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
AuthenticationException exception) throws IOException, ServletException;
}Redirects users to a login form when authentication is required.
package org.springframework.security.web.authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.security.web.PortMapper;
public class LoginUrlAuthenticationEntryPoint implements AuthenticationEntryPoint {
/**
* Creates an entry point with the login form URL.
*
* @param loginFormUrl the URL of the login form
*/
public LoginUrlAuthenticationEntryPoint(String loginFormUrl);
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException;
public void afterPropertiesSet();
/**
* Gets the login form URL.
*/
public String getLoginFormUrl();
/**
* Forces HTTPS for the redirect.
*/
public void setForceHttps(boolean forceHttps);
/**
* Sets the port mapper for HTTP/HTTPS port mapping.
*/
public void setPortMapper(PortMapper portMapper);
/**
* Uses server-side forward instead of redirect.
*/
public void setUseForward(boolean useForward);
/**
* Favors relative URIs over absolute URIs.
*/
public void setFavorRelativeUris(boolean favorRelativeUris);
}Selects an AuthenticationEntryPoint based on RequestMatcher evaluation.
package org.springframework.security.web.authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.security.web.util.matcher.RequestMatcher;
public class DelegatingAuthenticationEntryPoint implements AuthenticationEntryPoint {
/**
* Creates a delegating entry point.
*/
public DelegatingAuthenticationEntryPoint(
LinkedHashMap<RequestMatcher, AuthenticationEntryPoint> entryPoints);
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException;
/**
* Sets the default entry point when no matchers match.
*/
public void setDefaultEntryPoint(AuthenticationEntryPoint defaultEntryPoint);
public void afterPropertiesSet();
/**
* Returns a builder for constructing the entry point.
*/
public static Builder builder();
public static final class Builder {
/**
* Sets the default entry point.
*/
public Builder defaultEntryPoint(AuthenticationEntryPoint defaultEntryPoint);
/**
* Adds an entry point for matching requests.
*/
public Builder addEntryPointFor(AuthenticationEntryPoint entryPoint, RequestMatcher requestMatcher);
public DelegatingAuthenticationEntryPoint build();
}
}Returns HTTP 403 Forbidden status for authentication failures.
package org.springframework.security.web.authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
public final class Http403ForbiddenEntryPoint implements AuthenticationEntryPoint {
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException;
}Returns a configurable HTTP status code for authentication failures.
package org.springframework.security.web.authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
public final class HttpStatusEntryPoint implements AuthenticationEntryPoint {
/**
* Creates an entry point that returns the specified HTTP status.
*
* @param httpStatus the HTTP status to return
*/
public HttpStatusEntryPoint(HttpStatus httpStatus);
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException;
}An AuthenticationEntryPoint that does nothing.
package org.springframework.security.web.authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
public final class NoOpAuthenticationEntryPoint implements AuthenticationEntryPoint {
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException;
}Processes username/password authentication form submissions.
package org.springframework.security.web.authentication;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
public class UsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
public static final String SPRING_SECURITY_FORM_USERNAME_KEY = "username";
public static final String SPRING_SECURITY_FORM_PASSWORD_KEY = "password";
/**
* Creates a filter with default settings (POST /login).
*/
public UsernamePasswordAuthenticationFilter();
/**
* Creates a filter with the given authentication manager.
*/
public UsernamePasswordAuthenticationFilter(AuthenticationManager authenticationManager);
/**
* Performs authentication from username and password parameters.
*/
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
throws AuthenticationException;
/**
* Sets the request parameter name for username (default: "username").
*/
public void setUsernameParameter(String usernameParameter);
/**
* Sets the request parameter name for password (default: "password").
*/
public void setPasswordParameter(String passwordParameter);
/**
* Sets whether to only process POST requests (default: true).
*/
public void setPostOnly(boolean postOnly);
public final String getUsernameParameter();
public final String getPasswordParameter();
protected String obtainUsername(HttpServletRequest request);
protected String obtainPassword(HttpServletRequest request);
}Base class for handlers that redirect to a target URL.
package org.springframework.security.web.authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.web.RedirectStrategy;
public abstract class AbstractAuthenticationTargetUrlRequestHandler {
protected AbstractAuthenticationTargetUrlRequestHandler();
/**
* Performs the redirect or forward to the target URL.
*
* @param request the request
* @param response the response
* @param targetUrl the target URL
*/
protected void handle(HttpServletRequest request, HttpServletResponse response, String targetUrl)
throws IOException, ServletException;
/**
* Builds the target URL for redirection.
*
* @param request the request
* @param response the response
* @return the target URL
*/
protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response);
/**
* Sets the default target URL.
*/
public void setDefaultTargetUrl(String defaultTargetUrl);
protected String getDefaultTargetUrl();
/**
* Sets whether to always use the default target URL.
*/
public void setAlwaysUseDefaultTargetUrl(boolean alwaysUseDefaultTargetUrl);
protected boolean isAlwaysUseDefaultTargetUrl();
/**
* Sets the parameter name for the target URL.
*/
public void setTargetUrlParameter(String targetUrlParameter);
protected String getTargetUrlParameter();
/**
* Sets the redirect strategy.
*/
public void setRedirectStrategy(RedirectStrategy redirectStrategy);
protected RedirectStrategy getRedirectStrategy();
}Redirects or forwards to a configured URL on authentication success.
package org.springframework.security.web.authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.RedirectStrategy;
public class SimpleUrlAuthenticationSuccessHandler extends AbstractAuthenticationTargetUrlRequestHandler
implements AuthenticationSuccessHandler {
public SimpleUrlAuthenticationSuccessHandler();
/**
* Creates a handler with the specified target URL.
*/
public SimpleUrlAuthenticationSuccessHandler(String defaultTargetUrl);
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException;
public void setDefaultTargetUrl(String defaultTargetUrl);
public String getDefaultTargetUrl();
public void setAlwaysUseDefaultTargetUrl(boolean alwaysUseDefaultTargetUrl);
public void setTargetUrlParameter(String targetUrlParameter);
public void setUseReferer(boolean useReferer);
public void setRedirectStrategy(RedirectStrategy redirectStrategy);
}Uses saved request from RequestCache to redirect after authentication.
package org.springframework.security.web.authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.savedrequest.RequestCache;
public class SavedRequestAwareAuthenticationSuccessHandler
extends SimpleUrlAuthenticationSuccessHandler {
public SavedRequestAwareAuthenticationSuccessHandler();
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException;
/**
* Sets the RequestCache for retrieving saved requests.
*/
public void setRequestCache(RequestCache requestCache);
}Forwards to a target URL instead of redirecting.
package org.springframework.security.web.authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.core.Authentication;
public class ForwardAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
/**
* Creates a handler that forwards to the specified URL.
*/
public ForwardAuthenticationSuccessHandler(String forwardUrl);
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException;
}Uses HttpMessageConverter to write authentication response.
package org.springframework.security.web.authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.function.Function;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.security.core.Authentication;
public class HttpMessageConverterAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
/**
* Creates a handler with default JSON message converter.
*
* @since 6.4
*/
public HttpMessageConverterAuthenticationSuccessHandler();
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException;
/**
* Sets the function to extract the response body from Authentication.
*/
public void setAuthenticationConverter(Function<Authentication, ?> authenticationConverter);
/**
* Sets the HTTP message converter.
*/
public void setHttpMessageConverter(HttpMessageConverter<?> httpMessageConverter);
}Redirects to a failure URL on authentication failure.
package org.springframework.security.web.authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.RedirectStrategy;
public class SimpleUrlAuthenticationFailureHandler implements AuthenticationFailureHandler {
public SimpleUrlAuthenticationFailureHandler();
/**
* Creates a handler with the specified failure URL.
*/
public SimpleUrlAuthenticationFailureHandler(String defaultFailureUrl);
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
AuthenticationException exception) throws IOException, ServletException;
/**
* Sets the URL to redirect to on failure.
*/
public void setDefaultFailureUrl(String defaultFailureUrl);
/**
* Uses forward instead of redirect.
*/
public void setUseForward(boolean forwardToDestination);
public void setRedirectStrategy(RedirectStrategy redirectStrategy);
/**
* Allows session creation for storing failure details.
*/
public void setAllowSessionCreation(boolean allowSessionCreation);
}Maps exception types to different failure URLs.
package org.springframework.security.web.authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
import org.springframework.security.core.AuthenticationException;
public class ExceptionMappingAuthenticationFailureHandler
extends SimpleUrlAuthenticationFailureHandler {
public ExceptionMappingAuthenticationFailureHandler();
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
AuthenticationException exception) throws IOException, ServletException;
/**
* Sets exception class name to URL mappings.
*/
public void setExceptionMappings(Map<?, ?> failureUrlMap);
}Forwards to a target URL on authentication failure.
package org.springframework.security.web.authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.core.AuthenticationException;
public class ForwardAuthenticationFailureHandler implements AuthenticationFailureHandler {
/**
* Creates a handler that forwards to the specified URL.
*/
public ForwardAuthenticationFailureHandler(String forwardUrl);
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
AuthenticationException exception) throws IOException, ServletException;
}Delegates to different failure handlers based on exception type.
package org.springframework.security.web.authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.LinkedHashMap;
import org.springframework.security.core.AuthenticationException;
public class DelegatingAuthenticationFailureHandler implements AuthenticationFailureHandler {
/**
* Creates a delegating handler with exception to handler mappings.
*/
public DelegatingAuthenticationFailureHandler(
LinkedHashMap<Class<? extends AuthenticationException>, AuthenticationFailureHandler> handlers,
AuthenticationFailureHandler defaultHandler);
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
AuthenticationException exception) throws IOException, ServletException;
}Adapts an AuthenticationEntryPoint into an AuthenticationFailureHandler.
package org.springframework.security.web.authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
public class AuthenticationEntryPointFailureHandler implements AuthenticationFailureHandler {
/**
* Creates a handler that delegates to the entry point.
*/
public AuthenticationEntryPointFailureHandler(AuthenticationEntryPoint authenticationEntryPoint);
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
AuthenticationException exception) throws IOException, ServletException;
/**
* Sets whether to rethrow AuthenticationServiceException (default: true).
*/
public void setRethrowAuthenticationServiceException(boolean rethrowAuthenticationServiceException);
}HTTP Basic authentication support.
package org.springframework.security.web.authentication.www;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.context.SecurityContextHolderStrategy;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.web.filter.OncePerRequestFilter;
public class BasicAuthenticationFilter extends OncePerRequestFilter {
/**
* Creates a Basic authentication filter.
*/
public BasicAuthenticationFilter(AuthenticationManager authenticationManager);
/**
* Creates a Basic authentication filter with custom entry point.
*/
public BasicAuthenticationFilter(AuthenticationManager authenticationManager,
AuthenticationEntryPoint authenticationEntryPoint);
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain chain) throws IOException, ServletException;
public void setAuthenticationConverter(AuthenticationConverter authenticationConverter);
public void setAuthenticationSuccessHandler(AuthenticationSuccessHandler authenticationSuccessHandler);
public void setAuthenticationFailureHandler(AuthenticationFailureHandler authenticationFailureHandler);
public void setSecurityContextHolderStrategy(SecurityContextHolderStrategy securityContextHolderStrategy);
public void setSecurityContextRepository(SecurityContextRepository securityContextRepository);
}Converts Basic authentication headers to Authentication objects.
package org.springframework.security.web.authentication.www;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationConverter;
public class BasicAuthenticationConverter implements AuthenticationConverter {
public BasicAuthenticationConverter();
public Authentication convert(HttpServletRequest request);
public void setAuthenticationDetailsSource(
AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource);
public void setCredentialsCharset(String credentialsCharset);
}Entry point for HTTP Basic authentication.
package org.springframework.security.web.authentication.www;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
public class BasicAuthenticationEntryPoint implements AuthenticationEntryPoint {
public BasicAuthenticationEntryPoint();
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException;
/**
* Sets the realm name for the WWW-Authenticate header.
*/
public void setRealmName(String realmName);
public String getRealmName();
public void afterPropertiesSet();
}HTTP Digest authentication support.
package org.springframework.security.web.authentication.www;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.web.filter.GenericFilterBean;
public class DigestAuthenticationFilter extends GenericFilterBean {
public DigestAuthenticationFilter();
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;
public void setAuthenticationEntryPoint(DigestAuthenticationEntryPoint authenticationEntryPoint);
public void setUserDetailsService(UserDetailsService userDetailsService);
public void setPasswordAlreadyEncoded(boolean passwordAlreadyEncoded);
public void setCreateAuthenticatedToken(boolean createAuthenticatedToken);
public void setSecurityContextHolderStrategy(SecurityContextHolderStrategy securityContextHolderStrategy);
public void afterPropertiesSet();
}Entry point for HTTP Digest authentication.
package org.springframework.security.web.authentication.www;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
public class DigestAuthenticationEntryPoint implements AuthenticationEntryPoint {
public DigestAuthenticationEntryPoint();
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException;
/**
* Sets the realm name.
*/
public void setRealmName(String realmName);
/**
* Sets the key used to generate nonces.
*/
public void setKey(String key);
/**
* Sets the nonce validity period in seconds.
*/
public void setNonceValiditySeconds(int nonceValiditySeconds);
public String getRealmName();
public String getKey();
public int getNonceValiditySeconds();
public void afterPropertiesSet();
}Exception thrown when a digest authentication nonce has expired.
package org.springframework.security.web.authentication.www;
import org.springframework.security.core.AuthenticationException;
public class NonceExpiredException extends AuthenticationException {
/**
* Creates an exception for an expired nonce.
*/
public NonceExpiredException(String message);
/**
* Creates an exception for an expired nonce.
*/
public NonceExpiredException(String message, Throwable cause);
}Interface for remember-me authentication services.
package org.springframework.security.web.authentication;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
public interface RememberMeServices {
/**
* Checks for a remember-me cookie and auto-logins if present.
*/
Authentication autoLogin(HttpServletRequest request, HttpServletResponse response);
/**
* Called when authentication fails to allow cleanup.
*/
void loginFail(HttpServletRequest request, HttpServletResponse response);
/**
* Called when authentication succeeds to create remember-me cookie.
*/
void loginSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication successfulAuthentication);
}Base class for remember-me service implementations.
package org.springframework.security.web.authentication.rememberme;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.RememberMeServices;
public abstract class AbstractRememberMeServices implements RememberMeServices {
public static final String SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY = "remember-me";
public static final String DEFAULT_PARAMETER = "remember-me";
public static final int TWO_WEEKS_S = 1209600;
/**
* Creates an abstract remember-me service.
*
* @param key the key used for token generation
* @param userDetailsService the user details service
*/
protected AbstractRememberMeServices(String key, UserDetailsService userDetailsService);
public final Authentication autoLogin(HttpServletRequest request, HttpServletResponse response);
public void loginFail(HttpServletRequest request, HttpServletResponse response);
public void loginSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication successfulAuthentication);
/**
* Called to process the remember-me cookie.
*/
protected abstract UserDetails processAutoLoginCookie(String[] cookieTokens, HttpServletRequest request,
HttpServletResponse response);
/**
* Called when authentication succeeded to create the cookie.
*/
protected abstract void onLoginSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication successfulAuthentication);
/**
* Sets the cookie name (default: "remember-me").
*/
public void setCookieName(String cookieName);
/**
* Sets the remember-me parameter name (default: "remember-me").
*/
public void setParameter(String parameter);
/**
* Sets whether to use secure cookies (default: false).
*/
public void setUseSecureCookie(boolean useSecureCookie);
/**
* Sets the token validity period in seconds (default: 1209600 = 2 weeks).
*/
public void setTokenValiditySeconds(int tokenValiditySeconds);
/**
* Sets whether cookies should always be created regardless of parameter.
*/
public void setAlwaysRemember(boolean alwaysRemember);
/**
* Sets the cookie domain.
*/
public void setCookieDomain(String cookieDomain);
}Token-based remember-me implementation using hashed cookies.
package org.springframework.security.web.authentication.rememberme;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.RememberMeServices;
public class TokenBasedRememberMeServices extends AbstractRememberMeServices {
/**
* Creates token-based remember-me services.
*
* @param key the key used for generating tokens
* @param userDetailsService the user details service
*/
public TokenBasedRememberMeServices(String key, UserDetailsService userDetailsService);
public void onLoginSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication successfulAuthentication);
/**
* Sets the algorithm for token matching.
*/
public void setMatchingAlgorithm(RememberMeTokenAlgorithm matchingAlgorithm);
public String getDigestAlgorithm();
}Persistent token-based remember-me using database storage.
package org.springframework.security.web.authentication.rememberme;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetailsService;
public class PersistentTokenBasedRememberMeServices extends AbstractRememberMeServices {
public static final int DEFAULT_SERIES_LENGTH = 16;
public static final int DEFAULT_TOKEN_LENGTH = 16;
/**
* Creates persistent token-based remember-me services.
*/
public PersistentTokenBasedRememberMeServices(String key, UserDetailsService userDetailsService,
PersistentTokenRepository tokenRepository);
public void logout(HttpServletRequest request, HttpServletResponse response,
Authentication authentication);
/**
* Sets the length of the series identifier.
*/
public void setSeriesLength(int seriesLength);
/**
* Sets the length of the token value.
*/
public void setTokenLength(int tokenLength);
/**
* Sets token validity period in seconds.
*/
public void setTokenValiditySeconds(int tokenValiditySeconds);
}Repository for persistent remember-me tokens.
package org.springframework.security.web.authentication.rememberme;
import java.util.Date;
public interface PersistentTokenRepository {
/**
* Creates a new token.
*/
void createNewToken(PersistentRememberMeToken token);
/**
* Updates an existing token.
*/
void updateToken(String series, String tokenValue, Date lastUsed);
/**
* Loads a token by series identifier.
*/
PersistentRememberMeToken getTokenForSeries(String seriesId);
/**
* Removes all tokens for a user.
*/
void removeUserTokens(String username);
}Value object for persistent remember-me tokens.
package org.springframework.security.web.authentication.rememberme;
import java.util.Date;
public class PersistentRememberMeToken {
/**
* Creates a persistent remember-me token.
*
* @param username the username
* @param series the series identifier
* @param tokenValue the token value
* @param date the last used date
*/
public PersistentRememberMeToken(String username, String series, String tokenValue, Date date);
public String getUsername();
public String getSeries();
public String getTokenValue();
public Date getDate();
}JDBC-based implementation of PersistentTokenRepository.
package org.springframework.security.web.authentication.rememberme;
import java.util.Date;
import javax.sql.DataSource;
public class JdbcTokenRepositoryImpl implements PersistentTokenRepository {
public static final String CREATE_TABLE_SQL =
"create table persistent_logins (username varchar(64) not null, " +
"series varchar(64) primary key, token varchar(64) not null, " +
"last_used timestamp not null)";
public static final String DEF_TOKEN_BY_SERIES_SQL =
"select username,series,token,last_used from persistent_logins where series = ?";
public static final String DEF_INSERT_TOKEN_SQL =
"insert into persistent_logins (username, series, token, last_used) values(?,?,?,?)";
public static final String DEF_UPDATE_TOKEN_SQL =
"update persistent_logins set token = ?, last_used = ? where series = ?";
public static final String DEF_REMOVE_USER_TOKENS_SQL =
"delete from persistent_logins where username = ?";
public JdbcTokenRepositoryImpl();
public void createNewToken(PersistentRememberMeToken token);
public void updateToken(String series, String tokenValue, Date lastUsed);
public PersistentRememberMeToken getTokenForSeries(String seriesId);
public void removeUserTokens(String username);
public void setDataSource(DataSource dataSource);
/**
* Creates the database table on startup.
*/
public void setCreateTableOnStartup(boolean createTableOnStartup);
}In-memory implementation of PersistentTokenRepository.
package org.springframework.security.web.authentication.rememberme;
import java.util.Date;
import java.util.Map;
public class InMemoryTokenRepositoryImpl implements PersistentTokenRepository {
public InMemoryTokenRepositoryImpl();
public void createNewToken(PersistentRememberMeToken token);
public void updateToken(String series, String tokenValue, Date lastUsed);
public PersistentRememberMeToken getTokenForSeries(String seriesId);
public void removeUserTokens(String username);
}Exception thrown when a remember-me cookie theft is detected.
package org.springframework.security.web.authentication.rememberme;
import org.springframework.security.core.AuthenticationException;
public class CookieTheftException extends RememberMeAuthenticationException {
/**
* Creates an exception indicating cookie theft.
*/
public CookieTheftException(String message);
/**
* Creates an exception indicating cookie theft.
*/
public CookieTheftException(String message, Throwable cause);
}Exception thrown when a remember-me cookie is invalid.
package org.springframework.security.web.authentication.rememberme;
import org.springframework.security.core.AuthenticationException;
public class InvalidCookieException extends RememberMeAuthenticationException {
/**
* Creates an exception for an invalid cookie.
*/
public InvalidCookieException(String message);
/**
* Creates an exception for an invalid cookie.
*/
public InvalidCookieException(String message, Throwable cause);
}Base exception for remember-me authentication failures.
package org.springframework.security.web.authentication.rememberme;
import org.springframework.security.core.AuthenticationException;
public class RememberMeAuthenticationException extends AuthenticationException {
/**
* Creates a remember-me authentication exception.
*/
public RememberMeAuthenticationException(String message);
/**
* Creates a remember-me authentication exception.
*/
public RememberMeAuthenticationException(String message, Throwable cause);
}A no-op implementation of RememberMeServices that does nothing.
package org.springframework.security.web.authentication;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
public final class NullRememberMeServices implements RememberMeServices {
public Authentication autoLogin(HttpServletRequest request, HttpServletResponse response);
public void loginFail(HttpServletRequest request, HttpServletResponse response);
public void loginSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication successfulAuthentication);
}Filter that processes remember-me authentication.
package org.springframework.security.web.authentication.rememberme;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import java.io.IOException;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.context.SecurityContextHolderStrategy;
import org.springframework.security.web.authentication.RememberMeServices;
import org.springframework.web.filter.GenericFilterBean;
public class RememberMeAuthenticationFilter extends GenericFilterBean {
/**
* Creates a remember-me authentication filter.
*/
public RememberMeAuthenticationFilter(AuthenticationManager authenticationManager,
RememberMeServices rememberMeServices);
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;
public RememberMeServices getRememberMeServices();
public void setApplicationEventPublisher(ApplicationEventPublisher eventPublisher);
public void setAuthenticationSuccessHandler(AuthenticationSuccessHandler successHandler);
public void setSecurityContextRepository(SecurityContextRepository securityContextRepository);
public void setSecurityContextHolderStrategy(SecurityContextHolderStrategy securityContextHolderStrategy);
public void setSessionAuthenticationStrategy(SessionAuthenticationStrategy sessionStrategy);
public void afterPropertiesSet();
}Generates a default login page when no custom login page is configured.
package org.springframework.security.web.authentication.ui;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import java.io.IOException;
import org.springframework.web.filter.GenericFilterBean;
public class DefaultLoginPageGeneratingFilter extends GenericFilterBean {
public static final String DEFAULT_LOGIN_PAGE_URL = "/login";
public static final String ERROR_PARAMETER_NAME = "error";
public DefaultLoginPageGeneratingFilter();
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;
/**
* Sets the URL for login processing.
*/
public void setLoginPageUrl(String loginPageUrl);
/**
* Sets whether to enable username/password authentication.
*/
public void setUsernameParameter(String usernameParameter);
/**
* Sets the password parameter name.
*/
public void setPasswordParameter(String passwordParameter);
/**
* Sets whether to enable remember-me.
*/
public void setRememberMeParameter(String rememberMeParameter);
/**
* Sets whether OAuth2 login is enabled.
*/
public void setOauth2LoginEnabled(boolean oauth2LoginEnabled);
/**
* Sets whether SAML2 login is enabled.
*/
public void setSaml2LoginEnabled(boolean saml2LoginEnabled);
}Generates a default logout confirmation page.
package org.springframework.security.web.authentication.ui;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import java.io.IOException;
import org.springframework.web.filter.GenericFilterBean;
public class DefaultLogoutPageGeneratingFilter extends GenericFilterBean {
public static final String DEFAULT_LOGOUT_PAGE_URL = "/logout";
public DefaultLogoutPageGeneratingFilter();
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;
}Serves default static resources for the login page.
package org.springframework.security.web.authentication.ui;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import java.io.IOException;
import org.springframework.web.filter.GenericFilterBean;
public class DefaultResourcesFilter extends GenericFilterBean {
/**
* Creates a filter for serving default resources.
*
* @since 5.0
*/
public DefaultResourcesFilter();
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;
}Creates anonymous authentication when no authentication is present.
package org.springframework.security.web.authentication;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import java.io.IOException;
import java.util.List;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolderStrategy;
import org.springframework.web.filter.GenericFilterBean;
public class AnonymousAuthenticationFilter extends GenericFilterBean {
/**
* Creates an anonymous authentication filter with default principal "anonymousUser".
*
* @param key the key for anonymous tokens
*/
public AnonymousAuthenticationFilter(String key);
/**
* Creates an anonymous authentication filter.
*
* @param key the key for anonymous tokens
* @param principal the anonymous principal
* @param authorities the authorities granted to anonymous users
*/
public AnonymousAuthenticationFilter(String key, Object principal,
List<GrantedAuthority> authorities);
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException;
public void setAuthenticationDetailsSource(
AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource);
public void setSecurityContextHolderStrategy(SecurityContextHolderStrategy securityContextHolderStrategy);
public Object getPrincipal();
public List<GrantedAuthority> getAuthorities();
public void afterPropertiesSet();
}Converts one-time token from request to Authentication.
package org.springframework.security.web.authentication.ott;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationConverter;
public class OneTimeTokenAuthenticationConverter implements AuthenticationConverter {
public OneTimeTokenAuthenticationConverter();
public Authentication convert(HttpServletRequest request);
}Resolves one-time token generation requests.
package org.springframework.security.web.authentication.ott;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.security.authentication.ott.GenerateOneTimeTokenRequest;
public interface GenerateOneTimeTokenRequestResolver {
/**
* Resolves a one-time token generation request from the HTTP request.
*
* @param request the HttpServletRequest
* @return GenerateOneTimeTokenRequest or null
*/
GenerateOneTimeTokenRequest resolve(HttpServletRequest request);
}Handles successful one-time token generation.
package org.springframework.security.web.authentication.ott;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.authentication.ott.OneTimeToken;
public interface OneTimeTokenGenerationSuccessHandler {
/**
* Handles generated one-time tokens (e.g., send via email).
*
* @param request the request
* @param response the response
* @param oneTimeToken the generated token
*/
void handle(HttpServletRequest request, HttpServletResponse response,
OneTimeToken oneTimeToken) throws ServletException, IOException;
}Filter that generates one-time tokens for authentication (Since 6.4).
package org.springframework.security.web.authentication.ott;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.authentication.ott.OneTimeTokenService;
import org.springframework.web.filter.OncePerRequestFilter;
public class GenerateOneTimeTokenFilter extends OncePerRequestFilter {
/**
* Creates a filter for generating one-time tokens.
*
* @param oneTimeTokenService the one-time token service
* @since 6.4
*/
public GenerateOneTimeTokenFilter(OneTimeTokenService oneTimeTokenService);
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException;
/**
* Sets the request resolver for one-time token generation.
*/
public void setGenerateOneTimeTokenRequestResolver(
GenerateOneTimeTokenRequestResolver generateOneTimeTokenRequestResolver);
/**
* Sets the success handler for one-time token generation.
*/
public void setOneTimeTokenGenerationSuccessHandler(
OneTimeTokenGenerationSuccessHandler oneTimeTokenGenerationSuccessHandler);
}Filter that processes one-time token authentication (Since 6.4).
package org.springframework.security.web.authentication.ott;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
import org.springframework.security.web.util.matcher.RequestMatcher;
public class OneTimeTokenAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
/**
* Creates a one-time token authentication filter.
*
* @param defaultFilterProcessesUrl the URL to process
* @param authenticationManager the authentication manager
* @since 6.4
*/
public OneTimeTokenAuthenticationFilter(String defaultFilterProcessesUrl,
AuthenticationManager authenticationManager);
/**
* Creates a one-time token authentication filter with a request matcher.
*
* @param requiresAuthenticationRequestMatcher the request matcher
* @param authenticationManager the authentication manager
* @since 6.4
*/
public OneTimeTokenAuthenticationFilter(RequestMatcher requiresAuthenticationRequestMatcher,
AuthenticationManager authenticationManager);
}Default implementation that resolves one-time token generation requests (Since 6.4).
package org.springframework.security.web.authentication.ott;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.security.authentication.ott.GenerateOneTimeTokenRequest;
public class DefaultGenerateOneTimeTokenRequestResolver implements GenerateOneTimeTokenRequestResolver {
/**
* Creates a default request resolver.
*
* @since 6.4
*/
public DefaultGenerateOneTimeTokenRequestResolver();
public GenerateOneTimeTokenRequest resolve(HttpServletRequest request);
/**
* Sets the parameter name for username (default: "username").
*
* @param usernameParameter the username parameter name
*/
public void setUsernameParameter(String usernameParameter);
}Redirects after successful one-time token generation (Since 6.4).
package org.springframework.security.web.authentication.ott;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.security.authentication.ott.OneTimeToken;
public class RedirectOneTimeTokenGenerationSuccessHandler implements OneTimeTokenGenerationSuccessHandler {
/**
* Creates a handler that redirects to the specified URL.
*
* @param redirectUrl the URL to redirect to
* @since 6.4
*/
public RedirectOneTimeTokenGenerationSuccessHandler(String redirectUrl);
public void handle(HttpServletRequest request, HttpServletResponse response,
OneTimeToken oneTimeToken) throws ServletException, IOException;
/**
* Sets the redirect URL.
*
* @param redirectUrl the redirect URL
*/
public void setRedirectUrl(String redirectUrl);
}Generates a default one-time token submission page (Since 6.4).
package org.springframework.security.web.authentication.ott;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import java.io.IOException;
import org.springframework.web.filter.GenericFilterBean;
public class DefaultOneTimeTokenSubmitPageGeneratingFilter extends GenericFilterBean {
/**
* Creates a filter that generates a default one-time token submission page.
*
* @since 6.4
*/
public DefaultOneTimeTokenSubmitPageGeneratingFilter();
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;
/**
* Sets the URL for token submission.
*
* @param loginProcessingUrl the login processing URL
*/
public void setLoginProcessingUrl(String loginProcessingUrl);
}Pre-authentication filter using request headers (e.g., CA Siteminder).
package org.springframework.security.web.authentication.preauth;
public class RequestHeaderAuthenticationFilter extends AbstractPreAuthenticatedProcessingFilter {
public RequestHeaderAuthenticationFilter();
/**
* Sets the header name containing the principal.
*/
public void setPrincipalRequestHeader(String principalRequestHeader);
/**
* Sets the header name containing credentials.
*/
public void setCredentialsRequestHeader(String credentialsRequestHeader);
/**
* Throws exception if header is missing (default: true).
*/
public void setExceptionIfHeaderMissing(boolean exceptionIfHeaderMissing);
protected Object getPreAuthenticatedPrincipal(HttpServletRequest request);
protected Object getPreAuthenticatedCredentials(HttpServletRequest request);
}Pre-authentication filter using request attributes (e.g., Shibboleth).
package org.springframework.security.web.authentication.preauth;
public class RequestAttributeAuthenticationFilter extends AbstractPreAuthenticatedProcessingFilter {
public RequestAttributeAuthenticationFilter();
/**
* Sets the request attribute name containing the principal.
*/
public void setPrincipalEnvironmentVariable(String principalEnvironmentVariable);
/**
* Sets the request attribute name containing credentials.
*/
public void setCredentialsEnvironmentVariable(String credentialsEnvironmentVariable);
/**
* Throws exception if attribute is missing (default: true).
*/
public void setExceptionIfVariableMissing(boolean exceptionIfVariableMissing);
protected Object getPreAuthenticatedPrincipal(HttpServletRequest request);
protected Object getPreAuthenticatedCredentials(HttpServletRequest request);
}Pre-authentication using J2EE container authentication.
package org.springframework.security.web.authentication.preauth.j2ee;
import jakarta.servlet.http.HttpServletRequest;
public class J2eePreAuthenticatedProcessingFilter extends AbstractPreAuthenticatedProcessingFilter {
public J2eePreAuthenticatedProcessingFilter();
protected Object getPreAuthenticatedPrincipal(HttpServletRequest request);
protected Object getPreAuthenticatedCredentials(HttpServletRequest request);
}Pre-authentication using X.509 client certificates.
package org.springframework.security.web.authentication.preauth.x509;
public class X509AuthenticationFilter extends AbstractPreAuthenticatedProcessingFilter {
public X509AuthenticationFilter();
/**
* Sets the principal extractor for X.509 certificates.
*/
public void setPrincipalExtractor(X509PrincipalExtractor principalExtractor);
protected Object getPreAuthenticatedPrincipal(HttpServletRequest request);
protected Object getPreAuthenticatedCredentials(HttpServletRequest request);
}Extracts principal from X.509 certificates.
package org.springframework.security.web.authentication.preauth.x509;
import java.security.cert.X509Certificate;
public interface X509PrincipalExtractor {
/**
* Returns the principal for the given certificate.
*
* @param clientCert the X.509 certificate
* @return the principal (usually a String)
*/
Object extractPrincipal(X509Certificate clientCert);
}Extracts principal from X.509 Subject DN using regex.
package org.springframework.security.web.authentication.preauth.x509;
import java.security.cert.X509Certificate;
public class SubjectDnX509PrincipalExtractor implements X509PrincipalExtractor {
public SubjectDnX509PrincipalExtractor();
public Object extractPrincipal(X509Certificate clientCert);
/**
* Sets the regex for extracting the principal from Subject DN.
* Default: "CN=(.*?)(?:,|$)"
*/
public void setSubjectDnRegex(String subjectDnRegex);
public void setMessageSource(MessageSource messageSource);
}Allows administrators to switch to another user's context.
package org.springframework.security.web.authentication.switchuser;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import java.io.IOException;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.web.filter.GenericFilterBean;
public class SwitchUserFilter extends GenericFilterBean {
public static final String SPRING_SECURITY_SWITCH_USERNAME_KEY = "username";
public static final String ROLE_PREVIOUS_ADMINISTRATOR = "ROLE_PREVIOUS_ADMINISTRATOR";
public SwitchUserFilter();
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;
/**
* Sets the UserDetailsService for loading target users.
*/
public void setUserDetailsService(UserDetailsService userDetailsService);
/**
* Sets the URL for exiting switch user mode.
*/
public void setExitUserUrl(String exitUserUrl);
/**
* Sets the request matcher for exiting switch user mode.
*/
public void setExitUserMatcher(RequestMatcher exitUserMatcher);
/**
* Sets the URL for switching users.
*/
public void setSwitchUserUrl(String switchUserUrl);
/**
* Sets the request matcher for switching users.
*/
public void setSwitchUserMatcher(RequestMatcher switchUserMatcher);
/**
* Sets the username parameter name (default: "username").
*/
public void setUsernameParameter(String usernameParameter);
public void setAuthenticationDetailsSource(
AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource);
public void setSwitchUserAuthorityChanger(SwitchUserAuthorityChanger switchUserAuthorityChanger);
public void setApplicationEventPublisher(ApplicationEventPublisher eventPublisher);
public void setMessageSource(MessageSource messageSource);
public void afterPropertiesSet();
}Special GrantedAuthority that stores the original authentication for switch user functionality.
package org.springframework.security.web.authentication.switchuser;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
public class SwitchUserGrantedAuthority implements GrantedAuthority {
/**
* Creates a switch user granted authority.
*
* @param role the authority name
* @param source the original authentication
*/
public SwitchUserGrantedAuthority(String role, Authentication source);
public String getAuthority();
/**
* Returns the original authentication before switching.
*/
public Authentication getSource();
}Event published when a user switches to another user's context.
package org.springframework.security.authentication.event;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
public class AuthenticationSwitchUserEvent extends AbstractAuthenticationEvent {
/**
* Creates an authentication switch user event.
*
* @param authentication the target user authentication
* @param targetUser the target user details
*/
public AuthenticationSwitchUserEvent(Authentication authentication, UserDetails targetUser);
/**
* Returns the target user details.
*/
public UserDetails getTargetUser();
}Interface for customizing authorities when switching users.
package org.springframework.security.web.authentication.switchuser;
import java.util.Collection;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
public interface SwitchUserAuthorityChanger {
/**
* Modifies authorities for the switched user context.
*
* @param targetUser the target user authentication
* @param currentAuthentication the current authentication
* @param authorities the original authorities
* @return modified collection of authorities
*/
Collection<GrantedAuthority> modifyGrantedAuthorities(Authentication targetUser,
Authentication currentAuthentication,
Collection<? extends GrantedAuthority> authorities);
}Holds HTTP request details for authentication.
package org.springframework.security.web.authentication;
import jakarta.servlet.http.HttpServletRequest;
public class WebAuthenticationDetails {
/**
* Creates authentication details from the request.
*/
public WebAuthenticationDetails(HttpServletRequest request);
/**
* Returns the remote IP address.
*/
public String getRemoteAddress();
/**
* Returns the session ID.
*/
public String getSessionId();
public boolean equals(Object o);
public int hashCode();
public String toString();
}Creates WebAuthenticationDetails from requests.
package org.springframework.security.web.authentication;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.security.authentication.AuthenticationDetailsSource;
public class WebAuthenticationDetailsSource
implements AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails> {
public WebAuthenticationDetailsSource();
/**
* Builds WebAuthenticationDetails from the request.
*/
public WebAuthenticationDetails buildDetails(HttpServletRequest context);
}import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class FormLoginConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.formLogin(form -> form
.loginPage("/login")
.loginProcessingUrl("/perform_login")
.usernameParameter("email")
.passwordParameter("pass")
.defaultSuccessUrl("/dashboard", true)
.failureUrl("/login?error=true")
.permitAll()
);
return http.build();
}
}import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
import javax.sql.DataSource;
@Configuration
public class RememberMeConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http, DataSource dataSource) throws Exception {
http
.rememberMe(remember -> remember
.key("uniqueAndSecret")
.tokenRepository(persistentTokenRepository(dataSource))
.tokenValiditySeconds(86400) // 1 day
.rememberMeParameter("remember-me")
.rememberMeCookieName("my-remember-me")
.userDetailsService(userDetailsService())
);
return http.build();
}
@Bean
public PersistentTokenRepository persistentTokenRepository(DataSource dataSource) {
JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
tokenRepository.setDataSource(dataSource);
return tokenRepository;
}
}import org.springframework.security.web.authentication.AuthenticationFilter;
import org.springframework.security.web.authentication.DelegatingAuthenticationConverter;
import org.springframework.security.web.authentication.www.BasicAuthenticationConverter;
import org.springframework.security.web.servlet.util.matcher.PathPatternRequestMatcher;
@Configuration
public class MultiAuthConverterConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http,
AuthenticationManager authenticationManager) throws Exception {
// Create a delegating converter that tries multiple authentication methods
DelegatingAuthenticationConverter converter = new DelegatingAuthenticationConverter(
Arrays.asList(
new BasicAuthenticationConverter(), // Try HTTP Basic first
new BearerTokenAuthenticationConverter(), // Then Bearer token
new CustomHeaderAuthenticationConverter() // Finally custom header
)
);
AuthenticationFilter authFilter = new AuthenticationFilter(
authenticationManager,
converter
);
authFilter.setRequestMatcher(
PathPatternRequestMatcher.pathPattern("/api/**")
);
authFilter.setSuccessHandler(new HttpStatusReturningAuthenticationSuccessHandler());
authFilter.setFailureHandler(new HttpStatusAuthenticationFailureHandler());
http
.addFilterBefore(authFilter, UsernamePasswordAuthenticationFilter.class)
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/api/**").authenticated()
.anyRequest().permitAll()
);
return http.build();
}
}import org.springframework.security.core.AuthenticationException;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.AccountExpiredException;
import org.springframework.security.authentication.LockedException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
public class DetailedAuthenticationFailureHandler implements AuthenticationFailureHandler {
private final AuditService auditService;
private final AccountLockoutService lockoutService;
@Override
public void onAuthenticationFailure(HttpServletRequest request,
HttpServletResponse response,
AuthenticationException exception)
throws IOException, ServletException {
String username = request.getParameter("username");
String ipAddress = request.getRemoteAddr();
// Log authentication failure
auditService.logAuthenticationFailure(username, ipAddress, exception.getClass().getSimpleName());
// Handle account lockout
if (exception instanceof BadCredentialsException) {
lockoutService.recordFailedAttempt(username, ipAddress);
if (lockoutService.isLocked(username)) {
response.sendRedirect("/login?error=locked");
return;
}
}
// Different error messages for different exception types
String errorMessage;
if (exception instanceof AccountExpiredException) {
errorMessage = "account_expired";
} else if (exception instanceof LockedException) {
errorMessage = "account_locked";
} else if (exception instanceof BadCredentialsException) {
errorMessage = "bad_credentials";
} else {
errorMessage = "authentication_failed";
}
// For AJAX requests, return JSON
if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setContentType("application/json");
response.getWriter().write(
String.format("{\"error\": \"%s\", \"message\": \"%s\"}",
errorMessage, exception.getMessage())
);
} else {
// For regular requests, redirect with error parameter
response.sendRedirect("/login?error=" + errorMessage);
}
}
}import org.springframework.security.web.authentication.ott.GenerateOneTimeTokenFilter;
import org.springframework.security.web.authentication.ott.OneTimeTokenAuthenticationFilter;
import org.springframework.security.authentication.ott.OneTimeTokenService;
@Configuration
public class OneTimeTokenConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http,
AuthenticationManager authenticationManager,
OneTimeTokenService oneTimeTokenService) throws Exception {
// Filter to generate OTT
GenerateOneTimeTokenFilter generateFilter = new GenerateOneTimeTokenFilter(oneTimeTokenService);
generateFilter.setGenerateOneTimeTokenRequestResolver(
new DefaultGenerateOneTimeTokenRequestResolver()
);
generateFilter.setOneTimeTokenGenerationSuccessHandler(
new RedirectOneTimeTokenGenerationSuccessHandler("/ott-sent")
);
// Filter to authenticate with OTT
OneTimeTokenAuthenticationFilter authFilter =
new OneTimeTokenAuthenticationFilter("/login/ott", authenticationManager);
http
.addFilterBefore(generateFilter, UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(authFilter, UsernamePasswordAuthenticationFilter.class)
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/login/ott/generate").permitAll()
.requestMatchers("/login/ott").permitAll()
.anyRequest().authenticated()
);
return http.build();
}
}import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
public class CustomSuccessHandler implements AuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response,
Authentication authentication)
throws IOException, ServletException {
Set<String> roles = authentication.getAuthorities().stream()
.map(GrantedAuthority::getAuthority)
.collect(Collectors.toSet());
if (roles.contains("ROLE_ADMIN")) {
response.sendRedirect("/admin/dashboard");
} else if (roles.contains("ROLE_USER")) {
response.sendRedirect("/user/dashboard");
} else {
response.sendRedirect("/");
}
}
}import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SwitchUserConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
.switchUser(switchUser -> switchUser
.switchUserUrl("/admin/switch-user")
.exitUserUrl("/admin/exit-switch")
.switchUserParameter("username")
.targetUrl("/user/dashboard")
);
return http.build();
}
}import org.springframework.security.core.AuthenticationException;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.AccountExpiredException;
import org.springframework.security.authentication.LockedException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler;
@Configuration
public class ExceptionHandlingConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.formLogin(form -> form
.loginPage("/login")
.failureHandler(authenticationFailureHandler())
);
return http.build();
}
@Bean
public AuthenticationFailureHandler authenticationFailureHandler() {
Map<String, String> failureUrlMap = new HashMap<>();
failureUrlMap.put(BadCredentialsException.class.getName(), "/login?error=bad-credentials");
failureUrlMap.put(AccountExpiredException.class.getName(), "/login?error=account-expired");
failureUrlMap.put(LockedException.class.getName(), "/login?error=account-locked");
ExceptionMappingAuthenticationFailureHandler handler =
new ExceptionMappingAuthenticationFailureHandler();
handler.setExceptionMappings(failureUrlMap);
handler.setDefaultFailureUrl("/login?error=authentication-failed");
return handler;
}
}import org.springframework.security.web.authentication.AuthenticationConverter;
import org.springframework.security.core.Authentication;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
public class CustomAuthenticationConverter implements AuthenticationConverter {
@Override
public Authentication convert(HttpServletRequest request) {
String username = request.getParameter("email"); // Custom parameter name
String password = request.getParameter("pass");
// Return null if no credentials provided (skip authentication)
if (username == null || password == null || username.isEmpty() || password.isEmpty()) {
return null;
}
// Validate format
if (!isValidEmail(username)) {
throw new IllegalArgumentException("Invalid email format");
}
return new UsernamePasswordAuthenticationToken(username, password);
}
private boolean isValidEmail(String email) {
return email != null && email.contains("@") && email.contains(".");
}
}import org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
@Configuration
public class RememberMeTokenRotationConfig {
@Bean
public PersistentTokenRepository persistentTokenRepository(DataSource dataSource) {
JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
tokenRepository.setDataSource(dataSource);
tokenRepository.setCreateTableOnStartup(true); // Only for development
return tokenRepository;
}
@Bean
public PersistentTokenBasedRememberMeServices rememberMeServices(
UserDetailsService userDetailsService,
PersistentTokenRepository tokenRepository) {
PersistentTokenBasedRememberMeServices services =
new PersistentTokenBasedRememberMeServices(
"uniqueAndSecretKey",
userDetailsService,
tokenRepository
);
// Configure token rotation
services.setTokenValiditySeconds(86400 * 30); // 30 days
services.setSeriesLength(16);
services.setTokenLength(16);
services.setCookieName("remember-me");
services.setUseSecureCookie(true);
return services;
}
}import org.springframework.security.web.authentication.ott.GenerateOneTimeTokenFilter;
import org.springframework.security.web.authentication.ott.OneTimeTokenGenerationSuccessHandler;
import org.springframework.security.authentication.ott.OneTimeToken;
@Configuration
public class CustomOttConfig {
@Bean
public GenerateOneTimeTokenFilter generateOneTimeTokenFilter(
OneTimeTokenService oneTimeTokenService,
EmailService emailService) {
GenerateOneTimeTokenFilter filter =
new GenerateOneTimeTokenFilter(oneTimeTokenService);
filter.setOneTimeTokenGenerationSuccessHandler(
new OneTimeTokenGenerationSuccessHandler() {
@Override
public void handle(HttpServletRequest request,
HttpServletResponse response,
OneTimeToken oneTimeToken)
throws ServletException, IOException {
String username = request.getParameter("username");
String token = oneTimeToken.getToken();
// Send token via email
emailService.sendTokenEmail(username, token);
// Redirect to token entry page
response.sendRedirect("/login/ott?sent=true");
}
}
);
return filter;
}
}import org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter;
import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;
@Configuration
public class PreAuthHeaderConfig {
@Bean
public RequestHeaderAuthenticationFilter requestHeaderAuthenticationFilter(
AuthenticationManager authenticationManager) {
RequestHeaderAuthenticationFilter filter =
new RequestHeaderAuthenticationFilter();
filter.setPrincipalRequestHeader("X-User-Id");
filter.setCredentialsRequestHeader("X-User-Roles");
filter.setExceptionIfHeaderMissing(true);
filter.setAuthenticationManager(authenticationManager);
// Add validation
filter.setCheckForPrincipalChanges(true);
filter.setInvalidateSessionOnPrincipalChange(true);
return filter;
}
}Install with Tessl CLI
npx tessl i tessl/maven-spring-security-web