Class HttpSecurity
- All Implemented Interfaces:
SecurityBuilder<DefaultSecurityFilterChain>,HttpSecurityBuilder<HttpSecurity>
HttpSecurity is similar to Spring Security's XML <http> element in the
namespace configuration. It allows configuring web based security for specific http
requests. By default it will be applied to all requests, but can be restricted using
authorizeHttpRequests(Customizer) or other similar methods.
Example Usage
The most basic form based configuration can be seen below. The configuration will require that any URL that is requested will require a User with the role "ROLE_USER". It also defines an in memory authentication scheme with a user that has the username "user", the password "password", and the role "ROLE_USER". For additional examples, refer to the Java Doc of individual methods onHttpSecurity.
@Configuration
@EnableWebSecurity
public class FormLoginSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) {
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/**").hasRole("USER")
)
.formLogin(withDefaults());
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
- Since:
- 3.2
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionclassAllows mapping HTTP requests that thisHttpSecuritywill be used for -
Constructor Summary
ConstructorsConstructorDescriptionHttpSecurity(ObjectPostProcessor<Object> objectPostProcessor, AuthenticationManagerBuilder authenticationBuilder, Map<Class<?>, Object> sharedObjects) Creates a new instance -
Method Summary
Modifier and TypeMethodDescriptionaddFilter(jakarta.servlet.Filter filter) Adds aFilterthat must be an instance of or extend one of the Filters provided within the Security framework.addFilterAfter(jakarta.servlet.Filter filter, Class<? extends jakarta.servlet.Filter> afterFilter) Allows adding aFilterafter one of the knownFilterclasses.addFilterAt(jakarta.servlet.Filter filter, Class<? extends jakarta.servlet.Filter> atFilter) Adds the Filter at the location of the specified Filter class.addFilterBefore(jakarta.servlet.Filter filter, Class<? extends jakarta.servlet.Filter> beforeFilter) Allows adding aFilterbefore one of the knownFilterclasses.anonymous(Customizer<AnonymousConfigurer<HttpSecurity>> anonymousCustomizer) Allows configuring how an anonymous user is represented.authenticationManager(AuthenticationManager authenticationManager) Configure the defaultAuthenticationManager.authenticationProvider(AuthenticationProvider authenticationProvider) Allows adding an additionalAuthenticationProviderto be usedauthorizeHttpRequests(Customizer<AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry> authorizeHttpRequestsCustomizer) Allows restricting access based upon theHttpServletRequestusingRequestMatcherimplementations (i.e.protected voidInvoked prior to invoking eachSecurityConfigurer.configure(SecurityBuilder)method.cors(Customizer<CorsConfigurer<HttpSecurity>> corsCustomizer) Adds aCorsFilterto be used.csrf(Customizer<CsrfConfigurer<HttpSecurity>> csrfCustomizer) Enables CSRF protection.exceptionHandling(Customizer<ExceptionHandlingConfigurer<HttpSecurity>> exceptionHandlingCustomizer) Allows configuring exception handling.formLogin(Customizer<FormLoginConfigurer<HttpSecurity>> formLoginCustomizer) Specifies to support form based authentication.headers(Customizer<HeadersConfigurer<HttpSecurity>> headersCustomizer) Adds the Security headers to the response.httpBasic(Customizer<HttpBasicConfigurer<HttpSecurity>> httpBasicCustomizer) Configures HTTP Basic authentication.jee(Customizer<JeeConfigurer<HttpSecurity>> jeeCustomizer) Configures container based pre authentication.logout(Customizer<LogoutConfigurer<HttpSecurity>> logoutCustomizer) Provides logout support.oauth2AuthorizationServer(Customizer<OAuth2AuthorizationServerConfigurer> oauth2AuthorizationServerCustomizer) Configures OAuth 2.1 Authorization Server support.oauth2Client(Customizer<OAuth2ClientConfigurer<HttpSecurity>> oauth2ClientCustomizer) Configures OAuth 2.0 Client support.oauth2Login(Customizer<OAuth2LoginConfigurer<HttpSecurity>> oauth2LoginCustomizer) Configures authentication support using an OAuth 2.0 and/or OpenID Connect 1.0 Provider.oauth2ResourceServer(Customizer<OAuth2ResourceServerConfigurer<HttpSecurity>> oauth2ResourceServerCustomizer) Configures OAuth 2.0 Resource Server support.oidcLogout(Customizer<OidcLogoutConfigurer<HttpSecurity>> oidcLogoutCustomizer) oneTimeTokenLogin(Customizer<OneTimeTokenLoginConfigurer<HttpSecurity>> oneTimeTokenLoginConfigurerCustomizer) Configures One-Time Token Login Support.passwordManagement(Customizer<PasswordManagementConfigurer<HttpSecurity>> passwordManagementCustomizer) Adds support for the password management.protected DefaultSecurityFilterChainSubclasses must implement this method to build the object that is being returned.portMapper(Customizer<PortMapperConfigurer<HttpSecurity>> portMapperCustomizer) Allows configuring aPortMapperthat is available fromAbstractConfiguredSecurityBuilder.getSharedObject(Class).redirectToHttps(Customizer<HttpsRedirectConfigurer<HttpSecurity>> httpsRedirectConfigurerCustomizer) Configures channel security.rememberMe(Customizer<RememberMeConfigurer<HttpSecurity>> rememberMeCustomizer) Allows configuring of Remember Me authentication.requestCache(Customizer<RequestCacheConfigurer<HttpSecurity>> requestCacheCustomizer) Allows configuring the Request Cache.requiresChannel(Customizer<ChannelSecurityConfigurer<HttpSecurity>.ChannelRequestMatcherRegistry> requiresChannelCustomizer) Deprecated.saml2Login(Customizer<Saml2LoginConfigurer<HttpSecurity>> saml2LoginCustomizer) Configures authentication support using an SAML 2.0 Service Provider.saml2Logout(Customizer<Saml2LogoutConfigurer<HttpSecurity>> saml2LogoutCustomizer) Configures logout support for an SAML 2.0 Relying Party.saml2Metadata(Customizer<Saml2MetadataConfigurer<HttpSecurity>> saml2MetadataConfigurer) Configures a SAML 2.0 metadata endpoint that presents relying party configurations in an<md:EntityDescriptor>payload.securityContext(Customizer<SecurityContextConfigurer<HttpSecurity>> securityContextCustomizer) Sets up management of theSecurityContexton theSecurityContextHolderbetweenHttpServletRequest's.securityMatcher(String... patterns) Allows configuring theHttpSecurityto only be invoked when matching the provided set ofpatterns.securityMatcher(RequestMatcher requestMatcher) Allows configuring theHttpSecurityto only be invoked when matching the providedRequestMatcher.securityMatchers(Customizer<HttpSecurity.RequestMatcherConfigurer> requestMatcherCustomizer) Allows specifying whichHttpServletRequestinstances thisHttpSecuritywill be invoked on.servletApi(Customizer<ServletApiConfigurer<HttpSecurity>> servletApiCustomizer) Integrates theHttpServletRequestmethods with the values found on theSecurityContext.sessionManagement(Customizer<SessionManagementConfigurer<HttpSecurity>> sessionManagementCustomizer) Allows configuring of Session Management.<C> voidsetSharedObject(Class<C> sharedType, C object) Sets an object that is shared by multipleSecurityConfigurer.userDetailsService(UserDetailsService userDetailsService) Allows adding an additionalUserDetailsServiceto be usedwebAuthn(Customizer<WebAuthnConfigurer<HttpSecurity>> webAuthn) Specifies webAuthn/passkeys based authentication.x509(Customizer<X509Configurer<HttpSecurity>> x509Customizer) Configures X509 based pre authentication.Methods inherited from class org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder
apply, beforeInit, doBuild, getConfigurer, getConfigurers, getOrBuild, getSharedObject, getSharedObjects, objectPostProcessor, postProcess, removeConfigurer, removeConfigurers, with, withMethods inherited from class org.springframework.security.config.annotation.AbstractSecurityBuilder
build, getObjectMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface org.springframework.security.config.annotation.web.HttpSecurityBuilder
getConfigurer, getSharedObject, removeConfigurerMethods inherited from interface org.springframework.security.config.annotation.SecurityBuilder
build
-
Constructor Details
-
HttpSecurity
public HttpSecurity(ObjectPostProcessor<Object> objectPostProcessor, AuthenticationManagerBuilder authenticationBuilder, Map<Class<?>, Object> sharedObjects) Creates a new instance- Parameters:
objectPostProcessor- theObjectPostProcessorthat should be usedauthenticationBuilder- theAuthenticationManagerBuilderto use for additional updatessharedObjects- the shared Objects to initialize theHttpSecuritywith- See Also:
-
-
Method Details
-
headers
Adds the Security headers to the response. This is activated by default when usingEnableWebSecurity.Example Configurations
Accepting the default provided byEnableWebSecurityor only invokingheaders(Customizer)without invoking additional methods on it, is the equivalent of:@Configuration @EnableWebSecurity public class CsrfSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .headers((headers) -> headers .contentTypeOptions(withDefaults()) .xssProtection(withDefaults()) .cacheControl(withDefaults()) .httpStrictTransportSecurity(withDefaults()) .frameOptions(withDefaults() ); return http.build(); } }You can disable the headers using the following:@Configuration @EnableWebSecurity public class CsrfSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .headers((headers) -> headers.disable()); return http.build(); } }You can enable only a few of the headers by first invokingHeadersConfigurer.defaultsDisabled()and then invoking the appropriate methods on theheaders(Customizer)result. For example, the following will enableHeadersConfigurer.cacheControl(Customizer)andHeadersConfigurer.frameOptions(Customizer)only.@Configuration @EnableWebSecurity public class CsrfSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .headers((headers) -> headers .defaultsDisabled() .cacheControl(withDefaults()) .frameOptions(withDefaults()) ); return http.build(); } }You can also choose to keep the defaults but explicitly disable a subset of headers. For example, the following will enable all the default headers exceptHeadersConfigurer.frameOptions(Customizer).@Configuration @EnableWebSecurity public class CsrfSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .headers((headers) -> headers .frameOptions((frameOptions) -> frameOptions.disable()) ); return http.build(); } }- Parameters:
headersCustomizer- theCustomizerto provide more options for theHeadersConfigurer- Returns:
- the
HttpSecurityfor further customizations @
-
cors
Adds aCorsFilterto be used. If a bean by the name of corsFilter is provided, thatCorsFilteris used. Else if corsConfigurationSource is defined, then thatCorsConfigurationis used. You can enable CORS using:@Configuration @EnableWebSecurity public class CorsSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .cors(withDefaults()); return http.build(); } }- Parameters:
corsCustomizer- theCustomizerto provide more options for theCorsConfigurer- Returns:
- the
HttpSecurityfor further customizations @
-
sessionManagement
public HttpSecurity sessionManagement(Customizer<SessionManagementConfigurer<HttpSecurity>> sessionManagementCustomizer) Allows configuring of Session Management.Example Configuration
The following configuration demonstrates how to enforce that only a single instance of a user is authenticated at a time. If a user authenticates with the username "user" without logging out and an attempt to authenticate with "user" is made the first session will be forcibly terminated and sent to the "/login?expired" URL.@Configuration @EnableWebSecurity public class SessionManagementSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .anyRequest().hasRole("USER") ) .formLogin((formLogin) -> formLogin .permitAll() ) .sessionManagement((sessionManagement) -> sessionManagement .sessionConcurrency((sessionConcurrency) -> sessionConcurrency .maximumSessions(1) .expiredUrl("/login?expired") ) ); return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } }When usingSessionManagementConfigurer.maximumSessions(int), do not forget to configureHttpSessionEventPublisherfor the application to ensure that expired sessions are cleaned up. In a web.xml this can be configured using the following:<listener> <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> </listener>Alternatively,AbstractSecurityWebApplicationInitializer.enableHttpSessionEventPublisher()could return true.- Parameters:
sessionManagementCustomizer- theCustomizerto provide more options for theSessionManagementConfigurer- Returns:
- the
HttpSecurityfor further customizations @
-
portMapper
Allows configuring aPortMapperthat is available fromAbstractConfiguredSecurityBuilder.getSharedObject(Class). Other providedSecurityConfigurerobjects use this configuredPortMapperas a defaultPortMapperwhen redirecting from HTTP to HTTPS or from HTTPS to HTTP (for example when used in combination withrequiresChannel(Customizer))}. By default Spring Security uses aPortMapperImplwhich maps the HTTP port 8080 to the HTTPS port 8443 and the HTTP port of 80 to the HTTPS port of 443.Example Configuration
The following configuration will ensure that redirects within Spring Security from HTTP of a port of 9090 will redirect to HTTPS port of 9443 and the HTTP port of 80 to the HTTPS port of 443.@Configuration @EnableWebSecurity public class PortMapperSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .requiresChannel((requiresChannel) -> requiresChannel .anyRequest().requiresSecure() ) .portMapper((portMapper) -> portMapper .http(9090).mapsTo(9443) .http(80).mapsTo(443) ); return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } }- Parameters:
portMapperCustomizer- theCustomizerto provide more options for thePortMapperConfigurer- Returns:
- the
HttpSecurityfor further customizations - See Also:
-
jee
Configures container based pre authentication. In this case, authentication is managed by the Servlet Container.Example Configuration
The following configuration will use the principal found on theHttpServletRequestand if the user is in the role "ROLE_USER" or "ROLE_ADMIN" will add that to the resultingAuthentication.@Configuration @EnableWebSecurity public class JeeSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .requestMatchers("/**").hasRole("USER") ) .jee((jee) -> jee .mappableRoles("USER", "ADMIN") ); return http.build(); } }Developers wishing to use pre authentication with the container will need to ensure their web.xml configures the security constraints. For example, the web.xml (there is no equivalent Java based configuration supported by the Servlet specification) might look like:<login-config> <auth-method>FORM</auth-method> <form-login-config> <form-login-page>/login</form-login-page> <form-error-page>/login?error</form-error-page> </form-login-config> </login-config> <security-role> <role-name>ROLE_USER</role-name> </security-role> <security-constraint> <web-resource-collection> <web-resource-name>Public</web-resource-name> <description>Matches unconstrained pages</description> <url-pattern>/login</url-pattern> <url-pattern>/logout</url-pattern> <url-pattern>/resources/*</url-pattern> </web-resource-collection> </security-constraint> <security-constraint> <web-resource-collection> <web-resource-name>Secured Areas</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>ROLE_USER</role-name> </auth-constraint> </security-constraint>Last you will need to configure your container to contain the user with the correct roles. This configuration is specific to the Servlet Container, so consult your Servlet Container's documentation.- Parameters:
jeeCustomizer- theCustomizerto provide more options for theJeeConfigurer- Returns:
- the
HttpSecurityfor further customizations @
-
x509
Configures X509 based pre authentication.Example Configuration
The following configuration will attempt to extract the username from the X509 certificate. Remember that the Servlet Container will need to be configured to request client certificates in order for this to work.@Configuration @EnableWebSecurity public class X509SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .requestMatchers("/**").hasRole("USER") ) .x509(withDefaults()); return http.build(); } }- Parameters:
x509Customizer- theCustomizerto provide more options for theX509Configurer- Returns:
- the
HttpSecurityfor further customizations @
-
rememberMe
Allows configuring of Remember Me authentication.Example Configuration
The following configuration demonstrates how to allow token based remember me authentication. Upon authenticating if the HTTP parameter named "remember-me" exists, then the user will be remembered even after theirHttpSessionexpires.@Configuration @EnableWebSecurity public class RememberMeSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .requestMatchers("/**").hasRole("USER") ) .formLogin(withDefaults()) .rememberMe(withDefaults()); return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } }- Parameters:
rememberMeCustomizer- theCustomizerto provide more options for theRememberMeConfigurer- Returns:
- the
HttpSecurityfor further customizations @
-
authorizeHttpRequests
public HttpSecurity authorizeHttpRequests(Customizer<AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry> authorizeHttpRequestsCustomizer) Allows restricting access based upon theHttpServletRequestusingRequestMatcherimplementations (i.e. via URL patterns).Example Configurations
The most basic example is to configure all URLs to require the role "ROLE_USER". The configuration below requires authentication to every URL and will grant access to both the user "admin" and "user".@Configuration @EnableWebSecurity public class AuthorizeUrlsSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorize) -> authorize .requestMatchers("/**").hasRole("USER") ) .formLogin(withDefaults()); return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); UserDetails admin = User.withDefaultPasswordEncoder() .username("admin") .password("password") .roles("ADMIN", "USER") .build(); return new InMemoryUserDetailsManager(user, admin); } }We can also configure multiple URLs. The configuration below requires authentication to every URL and will grant access to URLs starting with /admin/ to only the "admin" user. All other URLs either user can access.@Configuration @EnableWebSecurity public class AuthorizeUrlsSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorize) -> authorize .requestMatchers("/admin/**").hasRole("ADMIN") .requestMatchers("/**").hasRole("USER") ) .formLogin(withDefaults()); return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); UserDetails admin = User.withDefaultPasswordEncoder() .username("admin") .password("password") .roles("ADMIN", "USER") .build(); return new InMemoryUserDetailsManager(user, admin); } }Note that the matchers are considered in order. Therefore, the following is invalid because the first matcher matches every request and will never get to the second mapping:@Configuration @EnableWebSecurity public class AuthorizeUrlsSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorize) -> authorize .requestMatchers("/**").hasRole("USER") .requestMatchers("/admin/**").hasRole("ADMIN") ); return http.build(); } }- Parameters:
authorizeHttpRequestsCustomizer- theCustomizerto provide more options for theAuthorizeHttpRequestsConfigurer.AuthorizationManagerRequestMatcherRegistry- Returns:
- the
HttpSecurityfor further customizations - Since:
- 5.5
-
requestCache
public HttpSecurity requestCache(Customizer<RequestCacheConfigurer<HttpSecurity>> requestCacheCustomizer) Allows configuring the Request Cache. For example, a protected page (/protected) may be requested prior to authentication. The application will redirect the user to a login page. After authentication, Spring Security will redirect the user to the originally requested protected page (/protected). This is automatically applied when usingEnableWebSecurity.Example Custom Configuration
The following example demonstrates how to disable request caching.@Configuration @EnableWebSecurity public class RequestCacheDisabledSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .requestMatchers("/**").hasRole("USER") ) .requestCache((requestCache) -> requestCache.disable() ); return http.build(); } }- Parameters:
requestCacheCustomizer- theCustomizerto provide more options for theRequestCacheConfigurer- Returns:
- the
HttpSecurityfor further customizations @
-
exceptionHandling
public HttpSecurity exceptionHandling(Customizer<ExceptionHandlingConfigurer<HttpSecurity>> exceptionHandlingCustomizer) Allows configuring exception handling. This is automatically applied when usingEnableWebSecurity.Example Custom Configuration
The following customization will ensure that users who are denied access are forwarded to the page "/errors/access-denied".@Configuration @EnableWebSecurity public class ExceptionHandlingSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .requestMatchers("/**").hasRole("USER") ) // sample exception handling customization .exceptionHandling((exceptionHandling) -> exceptionHandling .accessDeniedPage("/errors/access-denied") ); return http.build(); } }- Parameters:
exceptionHandlingCustomizer- theCustomizerto provide more options for theExceptionHandlingConfigurer- Returns:
- the
HttpSecurityfor further customizations @
-
securityContext
public HttpSecurity securityContext(Customizer<SecurityContextConfigurer<HttpSecurity>> securityContextCustomizer) Sets up management of theSecurityContexton theSecurityContextHolderbetweenHttpServletRequest's. This is automatically applied when usingEnableWebSecurity. The following customization specifies the sharedSecurityContextRepository@Configuration @EnableWebSecurity public class SecurityContextSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .securityContext((securityContext) -> securityContext .securityContextRepository(SCR) ); return http.build(); } }- Parameters:
securityContextCustomizer- theCustomizerto provide more options for theSecurityContextConfigurer- Returns:
- the
HttpSecurityfor further customizations @
-
servletApi
Integrates theHttpServletRequestmethods with the values found on theSecurityContext. This is automatically applied when usingEnableWebSecurity. You can disable it using:@Configuration @EnableWebSecurity public class ServletApiSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .servletApi((servletApi) -> servletApi.disable() ); return http.build(); } }- Parameters:
servletApiCustomizer- theCustomizerto provide more options for theServletApiConfigurer- Returns:
- the
HttpSecurityfor further customizations @
-
csrf
Enables CSRF protection. This is activated by default when usingEnableWebSecurity. You can disable it using:@Configuration @EnableWebSecurity public class CsrfSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .csrf((csrf) -> csrf.disable()); return http.build(); } }- Parameters:
csrfCustomizer- theCustomizerto provide more options for theCsrfConfigurer- Returns:
- the
HttpSecurityfor further customizations @
-
logout
Provides logout support. This is automatically applied when usingEnableWebSecurity. The default is that accessing the URL "/logout" will log the user out by invalidating the HTTP Session, cleaning up anyrememberMe(Customizer)authentication that was configured, clearing theSecurityContextHolder, and then redirect to "/login?success".Example Custom Configuration
The following customization to log out when the URL "/custom-logout" is invoked. Log out will remove the cookie named "remove", not invalidate the HttpSession, clear the SecurityContextHolder, and upon completion redirect to "/logout-success".@Configuration @EnableWebSecurity public class LogoutSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .requestMatchers("/**").hasRole("USER") ) .formLogin(withDefaults()) // sample logout customization .logout((logout) -> logout.deleteCookies("remove") .invalidateHttpSession(false) .logoutUrl("/custom-logout") .logoutSuccessUrl("/logout-success") ); return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } }- Parameters:
logoutCustomizer- theCustomizerto provide more options for theLogoutConfigurer- Returns:
- the
HttpSecurityfor further customizations @
-
anonymous
Allows configuring how an anonymous user is represented. This is automatically applied when used in conjunction withEnableWebSecurity. By default anonymous users will be represented with anAnonymousAuthenticationTokenand contain the role "ROLE_ANONYMOUS".Example Configuration
The following configuration demonstrates how to specify that anonymous users should contain the role "ROLE_ANON" instead.@Configuration @EnableWebSecurity public class AnonymousSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .requestMatchers("/**").hasRole("USER") ) .formLogin(withDefaults()) // sample anonymous customization .anonymous((anonymous) -> anonymous .authorities("ROLE_ANON") ); return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } }The following demonstrates how to represent anonymous users as null. Note that this can causeNullPointerExceptionin code that assumes anonymous authentication is enabled.@Configuration @EnableWebSecurity public class AnonymousSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .requestMatchers("/**").hasRole("USER") ) .formLogin(withDefaults()) // sample anonymous customization .anonymous((anonymous) -> anonymous.disable() ); return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } }- Parameters:
anonymousCustomizer- theCustomizerto provide more options for theAnonymousConfigurer- Returns:
- the
HttpSecurityfor further customizations @
-
formLogin
Specifies to support form based authentication. IfFormLoginConfigurer.loginPage(String)is not specified a default login page will be generated.Example Configurations
The most basic configuration defaults to automatically generating a login page at the URL "/login", redirecting to "/login?error" for authentication failure. The details of the login page can be found onFormLoginConfigurer.loginPage(String)@Configuration @EnableWebSecurity public class FormLoginSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .requestMatchers("/**").hasRole("USER") ) .formLogin(withDefaults()); return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } }The configuration below demonstrates customizing the defaults.@Configuration @EnableWebSecurity public class FormLoginSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .requestMatchers("/**").hasRole("USER") ) .formLogin((formLogin) -> formLogin .usernameParameter("username") .passwordParameter("password") .loginPage("/authentication/login") .failureUrl("/authentication/login?failed") .loginProcessingUrl("/authentication/login/process") ); return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } }- Parameters:
formLoginCustomizer- theCustomizerto provide more options for theFormLoginConfigurer- Returns:
- the
HttpSecurityfor further customizations - See Also:
-
saml2Login
Configures authentication support using an SAML 2.0 Service Provider.
The "authentication flow" is implemented using the Web Browser SSO Profile, using POST and REDIRECT bindings, as documented in the SAML V2.0 Core,Profiles and Bindings specifications.
As a prerequisite to using this feature, is that you have a SAML v2.0 Identity Provider to provide an assertion. The representation of the Service Provider, the relying party, and the remote Identity Provider, the asserting party is contained withinRelyingPartyRegistration.
RelyingPartyRegistration(s) are composed within aRelyingPartyRegistrationRepository, which is required and must be registered with theApplicationContextor configured viasaml2Login().relyingPartyRegistrationRepository(..).
The default configuration provides an auto-generated login page at"/login"and redirects to"/login?error"when an authentication error occurs. The login page will display each of the identity providers with a link that is capable of initiating the "authentication flow".
Example Configuration
The following example shows the minimal configuration required, using SimpleSamlPhp as the Authentication Provider.@Configuration @EnableWebSecurity public class Saml2LoginSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .anyRequest().authenticated() ) .saml2Login(withDefaults()); return http.build(); } @Bean public RelyingPartyRegistrationRepository relyingPartyRegistrationRepository() { return new InMemoryRelyingPartyRegistrationRepository(this.getSaml2RelyingPartyRegistration()); } private RelyingPartyRegistration getSaml2RelyingPartyRegistration() { //remote IDP entity ID String idpEntityId = "https://simplesaml-for-spring-saml.apps.pcfone.io/saml2/idp/metadata.php"; //remote WebSSO Endpoint - Where to Send AuthNRequests to String webSsoEndpoint = "https://simplesaml-for-spring-saml.apps.pcfone.io/saml2/idp/SSOService.php"; //local registration ID String registrationId = "simplesamlphp"; //local entity ID - autogenerated based on URL String localEntityIdTemplate = "{baseUrl}/saml2/service-provider-metadata/{registrationId}"; //local signing (and decryption key) Saml2X509Credential signingCredential = getSigningCredential(); //IDP certificate for verification of incoming messages Saml2X509Credential idpVerificationCertificate = getVerificationCertificate(); return RelyingPartyRegistration.withRegistrationId(registrationId) .remoteIdpEntityId(idpEntityId) .idpWebSsoUrl(webSsoEndpoint) .credential(signingCredential) .credential(idpVerificationCertificate) .localEntityIdTemplate(localEntityIdTemplate) .build(); } }- Parameters:
saml2LoginCustomizer- theCustomizerto provide more options for theSaml2LoginConfigurer- Returns:
- the
HttpSecurityfor further customizations - Since:
- 5.2
-
saml2Logout
public HttpSecurity saml2Logout(Customizer<Saml2LogoutConfigurer<HttpSecurity>> saml2LogoutCustomizer) Configures logout support for an SAML 2.0 Relying Party.
Implements the Single Logout Profile, using POST and REDIRECT bindings, as documented in the SAML V2.0 Core, Profiles and Bindings specifications.
As a prerequisite to using this feature, is that you have a SAML v2.0 Asserting Party to sent a logout request to. The representation of the relying party and the asserting party is contained withinRelyingPartyRegistration.
RelyingPartyRegistration(s) are composed within aRelyingPartyRegistrationRepository, which is required and must be registered with theApplicationContextor configured viasaml2Login(Customizer).
The default configuration provides an auto-generated logout endpoint at"/logout"and redirects to/login?logoutwhen logout completes.
Example Configuration
The following example shows the minimal configuration required, using a hypothetical asserting party.@EnableWebSecurity @Configuration public class Saml2LogoutSecurityConfig { @Bean public SecurityFilterChain web(HttpSecurity http) { http .authorizeHttpRequests((authorize) -> authorize .anyRequest().authenticated() ) .saml2Login(withDefaults()) .saml2Logout(withDefaults()); return http.build(); } @Bean public RelyingPartyRegistrationRepository relyingPartyRegistrationRepository() { RelyingPartyRegistration registration = RelyingPartyRegistrations .withMetadataLocation("https://ap.example.org/metadata") .registrationId("simple") .build(); return new InMemoryRelyingPartyRegistrationRepository(registration); } }- Returns:
- the
HttpSecurityfor further customizations - Since:
- 5.6
-
saml2Metadata
public HttpSecurity saml2Metadata(Customizer<Saml2MetadataConfigurer<HttpSecurity>> saml2MetadataConfigurer) Configures a SAML 2.0 metadata endpoint that presents relying party configurations in an<md:EntityDescriptor>payload.By default, the endpoints are
/saml2/metadataand/saml2/metadata/{registrationId}though note that also/saml2/service-provider-metadata/{registrationId}is recognized for backward compatibility purposes.Example Configuration
The following example shows the minimal configuration required, using a hypothetical asserting party.@EnableWebSecurity @Configuration public class Saml2LogoutSecurityConfig { @Bean public SecurityFilterChain web(HttpSecurity http) { http .authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated()) .saml2Metadata(Customizer.withDefaults()); return http.build(); } @Bean public RelyingPartyRegistrationRepository relyingPartyRegistrationRepository() { RelyingPartyRegistration registration = RelyingPartyRegistrations .withMetadataLocation("https://ap.example.org/metadata") .registrationId("simple") .build(); return new InMemoryRelyingPartyRegistrationRepository(registration); } }- Parameters:
saml2MetadataConfigurer- theCustomizerto provide more options for theSaml2MetadataConfigurer- Returns:
- the
HttpSecurityfor further customizations - Since:
- 6.1
-
oauth2Login
public HttpSecurity oauth2Login(Customizer<OAuth2LoginConfigurer<HttpSecurity>> oauth2LoginCustomizer) Configures authentication support using an OAuth 2.0 and/or OpenID Connect 1.0 Provider.
The "authentication flow" is implemented using the Authorization Code Grant, as specified in the OAuth 2.0 Authorization Framework and OpenID Connect Core 1.0 specification.
As a prerequisite to using this feature, you must register a client with a provider. The client registration information may than be used for configuring aClientRegistrationusing aClientRegistration.Builder.
ClientRegistration(s) are composed within aClientRegistrationRepository, which is required and must be registered with theApplicationContextor configured viaoauth2Login().clientRegistrationRepository(..).
The default configuration provides an auto-generated login page at"/login"and redirects to"/login?error"when an authentication error occurs. The login page will display each of the clients with a link that is capable of initiating the "authentication flow".
Example Configuration
The following example shows the minimal configuration required, using Google as the Authentication Provider.@Configuration @EnableWebSecurity public class OAuth2LoginSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .anyRequest().authenticated() ) .oauth2Login(withDefaults()); return http.build(); } @Bean public ClientRegistrationRepository clientRegistrationRepository() { return new InMemoryClientRegistrationRepository(this.googleClientRegistration()); } private ClientRegistration googleClientRegistration() { return ClientRegistration.withRegistrationId("google") .clientId("google-client-id") .clientSecret("google-client-secret") .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC) .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) .redirectUri("{baseUrl}/login/oauth2/code/{registrationId}") .scope("openid", "profile", "email", "address", "phone") .authorizationUri("https://accounts.google.com/o/oauth2/v2/auth") .tokenUri("https://www.googleapis.com/oauth2/v4/token") .userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo") .userNameAttributeName(IdTokenClaimNames.SUB) .jwkSetUri("https://www.googleapis.com/oauth2/v3/certs") .clientName("Google") .build(); } }For more advanced configuration, see
OAuth2LoginConfigurerfor available options to customize the defaults.- Parameters:
oauth2LoginCustomizer- theCustomizerto provide more options for theOAuth2LoginConfigurer- Returns:
- the
HttpSecurityfor further customizations - See Also:
-
oidcLogout
-
oidcLogout
-
oauth2Client
public HttpSecurity oauth2Client(Customizer<OAuth2ClientConfigurer<HttpSecurity>> oauth2ClientCustomizer) Configures OAuth 2.0 Client support.Example Configuration
The following example demonstrates how to enable OAuth 2.0 Client support for all endpoints.@Configuration @EnableWebSecurity public class OAuth2ClientSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .anyRequest().authenticated() ) .oauth2Client(withDefaults()); return http.build(); } }- Parameters:
oauth2ClientCustomizer- theCustomizerto provide more options for theOAuth2ClientConfigurer- Returns:
- the
HttpSecurityfor further customizations - See Also:
-
oauth2ResourceServer
public HttpSecurity oauth2ResourceServer(Customizer<OAuth2ResourceServerConfigurer<HttpSecurity>> oauth2ResourceServerCustomizer) Configures OAuth 2.0 Resource Server support.Example Configuration
The following example demonstrates how to configure a custom JWT authentication converter.@Configuration @EnableWebSecurity public class OAuth2ResourceServerSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .anyRequest().authenticated() ) .oauth2ResourceServer((oauth2ResourceServer) -> oauth2ResourceServer .jwt((jwt) -> jwt .decoder(jwtDecoder()) ) ); return http.build(); } @Bean public JwtDecoder jwtDecoder() { return NimbusJwtDecoder.withPublicKey(this.key).build(); } }- Parameters:
oauth2ResourceServerCustomizer- theCustomizerto provide more options for theOAuth2ResourceServerConfigurer- Returns:
- the
HttpSecurityfor further customizations - See Also:
-
oauth2AuthorizationServer
public HttpSecurity oauth2AuthorizationServer(Customizer<OAuth2AuthorizationServerConfigurer> oauth2AuthorizationServerCustomizer) Configures OAuth 2.1 Authorization Server support.- Parameters:
oauth2AuthorizationServerCustomizer- theCustomizerproviding access to theOAuth2AuthorizationServerConfigurerfor further customizations- Returns:
- the
HttpSecurityfor further customizations - Since:
- 7.0
- See Also:
-
oneTimeTokenLogin
public HttpSecurity oneTimeTokenLogin(Customizer<OneTimeTokenLoginConfigurer<HttpSecurity>> oneTimeTokenLoginConfigurerCustomizer) Configures One-Time Token Login Support.Example Configuration
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorize) -> authorize .anyRequest().authenticated() ) .oneTimeTokenLogin(Customizer.withDefaults()); return http.build(); } @Bean public OneTimeTokenGenerationSuccessHandler oneTimeTokenGenerationSuccessHandler() { return new MyMagicLinkOneTimeTokenGenerationSuccessHandler(); } }- Parameters:
oneTimeTokenLoginConfigurerCustomizer- theCustomizerto provide more options for theOneTimeTokenLoginConfigurer- Returns:
- the
HttpSecurityfor further customizations @
-
requiresChannel
@Deprecated public HttpSecurity requiresChannel(Customizer<ChannelSecurityConfigurer<HttpSecurity>.ChannelRequestMatcherRegistry> requiresChannelCustomizer) Configures channel security. In order for this configuration to be useful at least one mapping to a required channel must be provided.Example Configuration
The example below demonstrates how to require HTTPs for every request. Only requiring HTTPS for some requests is supported, but not recommended since an application that allows for HTTP introduces many security vulnerabilities. For one such example, read about Firesheep.@Configuration @EnableWebSecurity public class ChannelSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .requestMatchers("/**").hasRole("USER") ) .formLogin(withDefaults()) .requiresChannel((requiresChannel) -> requiresChannel .anyRequest().requiresSecure() ); return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } }- Parameters:
requiresChannelCustomizer- theCustomizerto provide more options for theChannelSecurityConfigurer.ChannelRequestMatcherRegistry- Returns:
- the
HttpSecurityfor further customizations
-
redirectToHttps
public HttpSecurity redirectToHttps(Customizer<HttpsRedirectConfigurer<HttpSecurity>> httpsRedirectConfigurerCustomizer) Configures channel security. In order for this configuration to be useful at least one mapping to a required channel must be provided.Example Configuration
The example below demonstrates how to require HTTPS for every request. Only requiring HTTPS for some requests is supported, for example if you need to differentiate between local and production deployments.@Configuration @EnableWebSecurity public class RequireHttpsConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorize) -> authorize anyRequest().authenticated() ) .formLogin(withDefaults()) .redirectToHttps(withDefaults()); return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } }- Parameters:
httpsRedirectConfigurerCustomizer- theCustomizerto provide more options for theHttpsRedirectConfigurer- Returns:
- the
HttpSecurityfor further customizations
-
httpBasic
Configures HTTP Basic authentication.Example Configuration
The example below demonstrates how to configure HTTP Basic authentication for an application. The default realm is "Realm", but can be customized usingHttpBasicConfigurer.realmName(String).@Configuration @EnableWebSecurity public class HttpBasicSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .requestMatchers("/**").hasRole("USER") ) .httpBasic(withDefaults()); return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } }- Parameters:
httpBasicCustomizer- theCustomizerto provide more options for theHttpBasicConfigurer- Returns:
- the
HttpSecurityfor further customizations @
-
passwordManagement
public HttpSecurity passwordManagement(Customizer<PasswordManagementConfigurer<HttpSecurity>> passwordManagementCustomizer) Adds support for the password management.Example Configuration
The example below demonstrates how to configure password management for an application. The default change password page is "/change-password", but can be customized usingPasswordManagementConfigurer.changePasswordPage(String).@Configuration @EnableWebSecurity public class PasswordManagementSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .authorizeHttpRequests(authorizeHttpRequests -> authorizeHttpRequests .requestMatchers("/**").hasRole("USER") ) .passwordManagement(passwordManagement -> passwordManagement .changePasswordPage("/custom-change-password-page") ); return http.build(); } }- Parameters:
passwordManagementCustomizer- theCustomizerto provide more options for thePasswordManagementConfigurer- Returns:
- the
HttpSecurityfor further customizations - Since:
- 5.6
-
authenticationManager
Configure the defaultAuthenticationManager.- Parameters:
authenticationManager- theAuthenticationManagerto use- Returns:
- the
HttpSecurityfor further customizations - Since:
- 5.6
-
beforeConfigure
protected void beforeConfigure()Description copied from class:AbstractConfiguredSecurityBuilderInvoked prior to invoking eachSecurityConfigurer.configure(SecurityBuilder)method. Subclasses may override this method to hook into the lifecycle without using aSecurityConfigurer.- Overrides:
beforeConfigurein classAbstractConfiguredSecurityBuilder<DefaultSecurityFilterChain,HttpSecurity>
-
performBuild
Description copied from class:AbstractConfiguredSecurityBuilderSubclasses must implement this method to build the object that is being returned.- Specified by:
performBuildin classAbstractConfiguredSecurityBuilder<DefaultSecurityFilterChain,HttpSecurity> - Returns:
- the Object to be buit or null if the implementation allows it
-
authenticationProvider
Description copied from interface:HttpSecurityBuilderAllows adding an additionalAuthenticationProviderto be used- Specified by:
authenticationProviderin interfaceHttpSecurityBuilder<HttpSecurity>- Parameters:
authenticationProvider- theAuthenticationProviderto be added- Returns:
- the
HttpSecurityfor further customizations
-
userDetailsService
Description copied from interface:HttpSecurityBuilderAllows adding an additionalUserDetailsServiceto be used- Specified by:
userDetailsServicein interfaceHttpSecurityBuilder<HttpSecurity>- Parameters:
userDetailsService- theUserDetailsServiceto be added- Returns:
- the
HttpSecurityfor further customizations
-
addFilterAfter
public HttpSecurity addFilterAfter(jakarta.servlet.Filter filter, Class<? extends jakarta.servlet.Filter> afterFilter) Description copied from interface:HttpSecurityBuilderAllows adding aFilterafter one of the knownFilterclasses. The knownFilterinstances are either aFilterlisted inHttpSecurityBuilder.addFilter(Filter)or aFilterthat has already been added usingHttpSecurityBuilder.addFilterAfter(Filter, Class)orHttpSecurityBuilder.addFilterBefore(Filter, Class).- Specified by:
addFilterAfterin interfaceHttpSecurityBuilder<HttpSecurity>- Parameters:
filter- theFilterto register after the typeafterFilterafterFilter- the Class of the knownFilter.- Returns:
- the
HttpSecurityfor further customizations
-
addFilterBefore
public HttpSecurity addFilterBefore(jakarta.servlet.Filter filter, Class<? extends jakarta.servlet.Filter> beforeFilter) Description copied from interface:HttpSecurityBuilderAllows adding aFilterbefore one of the knownFilterclasses. The knownFilterinstances are either aFilterlisted inHttpSecurityBuilder.addFilter(Filter)or aFilterthat has already been added usingHttpSecurityBuilder.addFilterAfter(Filter, Class)orHttpSecurityBuilder.addFilterBefore(Filter, Class).- Specified by:
addFilterBeforein interfaceHttpSecurityBuilder<HttpSecurity>- Parameters:
filter- theFilterto register before the typebeforeFilterbeforeFilter- the Class of the knownFilter.- Returns:
- the
HttpSecurityfor further customizations
-
addFilter
Description copied from interface:HttpSecurityBuilderAdds aFilterthat must be an instance of or extend one of the Filters provided within the Security framework. The method ensures that the ordering of the Filters is automatically taken care of. The ordering of the Filters is:DisableEncodeUrlFilterForceEagerSessionCreationFilterChannelProcessingFilterHttpsRedirectFilterWebAsyncManagerIntegrationFilterSecurityContextHolderFilterSecurityContextPersistenceFilterHeaderWriterFilterCorsFilterCsrfFilterLogoutFilterOAuth2AuthorizationRequestRedirectFilterSaml2WebSsoAuthenticationRequestFilterX509AuthenticationFilterAbstractPreAuthenticatedProcessingFilter- CasAuthenticationFilter
OAuth2LoginAuthenticationFilterSaml2WebSsoAuthenticationFilterUsernamePasswordAuthenticationFilterDefaultLoginPageGeneratingFilterDefaultLogoutPageGeneratingFilterConcurrentSessionFilterDigestAuthenticationFilterBearerTokenAuthenticationFilterBasicAuthenticationFilterAuthenticationFilterRequestCacheAwareFilterSecurityContextHolderAwareRequestFilterJaasApiIntegrationFilterRememberMeAuthenticationFilterAnonymousAuthenticationFilterOAuth2AuthorizationCodeGrantFilterSessionManagementFilterExceptionTranslationFilterFilterSecurityInterceptorAuthorizationFilterSwitchUserFilter
- Specified by:
addFilterin interfaceHttpSecurityBuilder<HttpSecurity>- Parameters:
filter- theFilterto add- Returns:
- the
HttpSecurityfor further customizations
-
addFilterAt
public HttpSecurity addFilterAt(jakarta.servlet.Filter filter, Class<? extends jakarta.servlet.Filter> atFilter) Adds the Filter at the location of the specified Filter class. For example, if you want the filter CustomFilter to be registered in the same position asUsernamePasswordAuthenticationFilter, you can invoke:addFilterAt(new CustomFilter(), UsernamePasswordAuthenticationFilter.class)
Registration of multiple Filters in the same location means their ordering is not deterministic. More concretely, registering multiple Filters in the same location does not override existing Filters. Instead, do not register Filters you do not want to use.- Parameters:
filter- the Filter to registeratFilter- the location of anotherFilterthat is already registered (i.e. known) with Spring Security.- Returns:
- the
HttpSecurityfor further customizations
-
securityMatchers
public HttpSecurity securityMatchers(Customizer<HttpSecurity.RequestMatcherConfigurer> requestMatcherCustomizer) Allows specifying whichHttpServletRequestinstances thisHttpSecuritywill be invoked on. This method allows for easily invoking theHttpSecurityfor multiple differentRequestMatcherinstances. If only a singleRequestMatcheris necessary consider usingsecurityMatcher(String...), orsecurityMatcher(RequestMatcher).Invoking
securityMatchers(Customizer)will not override previous invocations of#securityMatchers()},securityMatchers(Customizer)securityMatcher(String...)andsecurityMatcher(RequestMatcher)Example Configurations
The following configuration enables theHttpSecurityfor URLs that begin with "/api/" or "/oauth/".@Configuration @EnableWebSecurity public class RequestMatchersSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .securityMatchers((matchers) -> matchers .requestMatchers("/api/**", "/oauth/**") ) .authorizeHttpRequests((authorize) -> authorize .anyRequest().hasRole("USER") ) .httpBasic(withDefaults()); return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } }The configuration below is the same as the previous configuration.@Configuration @EnableWebSecurity public class RequestMatchersSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .securityMatchers((matchers) -> matchers .requestMatchers("/api/**") .requestMatchers("/oauth/**") ) .authorizeHttpRequests((authorize) -> authorize .anyRequest().hasRole("USER") ) .httpBasic(withDefaults()); return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } }The configuration below is also the same as the above configuration.@Configuration @EnableWebSecurity public class RequestMatchersSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http .securityMatchers((matchers) -> matchers .requestMatchers("/api/**") ) .securityMatchers((matchers) -> matchers .requestMatchers("/oauth/**") ) .authorizeHttpRequests((authorize) -> authorize .anyRequest().hasRole("USER") ) .httpBasic(withDefaults()); return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } }- Parameters:
requestMatcherCustomizer- theCustomizerto provide more options for theHttpSecurity.RequestMatcherConfigurer- Returns:
- the
HttpSecurityfor further customizations
-
securityMatcher
Allows configuring theHttpSecurityto only be invoked when matching the providedRequestMatcher. If more advanced configuration is necessary, consider usingsecurityMatchers(Customizer)()}.Invoking
securityMatcher(RequestMatcher)will override previous invocations ofsecurityMatcher(RequestMatcher),securityMatcher(String...),securityMatchers(Customizer)and#securityMatchers()- Parameters:
requestMatcher- theRequestMatcherto use, for example,PathPatternRequestMatcher.pathPattern(HttpMethod.GET, "/admin/**")- Returns:
- the
HttpSecurityfor further customizations - See Also:
-
securityMatcher
Allows configuring theHttpSecurityto only be invoked when matching the provided set ofpatterns. SeePathPatternfor matching rulesInvoking
securityMatcher(String...)will override previous invocations ofsecurityMatcher(String...)(String)}},securityMatcher(RequestMatcher)()},securityMatchers(Customizer)(String)} and#securityMatchers()(String)}.- Parameters:
patterns- the pattern to match on (i.e. "/admin/**")- Returns:
- the
HttpSecurityfor further customizations - See Also:
-
PathPatternRequestMatcherPathPattern
-
webAuthn
Specifies webAuthn/passkeys based authentication.@Bean SecurityFilterChain securityFilterChain(HttpSecurity http) { http // ... .webAuthn((webAuthn) -> webAuthn .rpId("example.com") .allowedOrigins("https://example.com") ); return http.build(); }- Parameters:
webAuthn- the customizer to apply- Returns:
- the
HttpSecurityfor further customizations @
-
redirectToHttps(org.springframework.security.config.Customizer<org.springframework.security.config.annotation.web.configurers.HttpsRedirectConfigurer<org.springframework.security.config.annotation.web.builders.HttpSecurity>>)