I’m relatively new to Spring and am currently migrating a microservice from Java 8 to Java 17.
As WebSecurityConfigurerAdapter is deprecated and no longer in use, I need to re-write my WebSecurityConfiguration class. My original code is as follows:
@Override
protected void configure(final HttpSecurity http) throws Exception {
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().csrf().disable().x509()
.x509AuthenticationFilter(this.x509FilterBean()).subjectPrincipalRegex("CN=(.*?)(?:, |$)").userDetailsService(this.userDetailsService);
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Bean
public X509AuthenticationFilter x509FilterBean() throws Exception {
if (null == this.x509AuthenticationFilter) {
this.x509AuthenticationFilter = new X509AuthenticationFilter();
this.x509AuthenticationFilter.setContinueFilterChainOnUnsuccessfulAuthentication (false);
this.x509AuthenticationFilter.setAuthenticationManager(this.authenticationManagerBean());
}
return this.x509AuthenticationFilter;
}
I have rewritten the code as follows:
@Bean
public SecurityFilterChain filterChain (HttpSecurity http) throws Exception {
http.sessionManagement (session -> session.sessionCreation Policy (SessionCreationPolicy. STATELESS))
.csrf(AbstractHttpConfigurer::disable).x509(x509. -> {
try {
x509.x509AuthenticationFilter(this.x509FilterBean(this.authenticationManager(http.getSharedObject (AuthenticationConfiguration.class))));
x509.subjectPrincipal Regex("CN=(.*?)(?:,|$)");
x509.userDetailsService(this.userDetailsService);
} catch (Exception e) {
e.printStackTrace();
}
return http.build();
}
@Bean
public AuthenticationManager authenticationManager (AuthenticationConfiguration authenticationConfiguration) throws Exception {
return authenticationConfiguration.getAuthenticationManager();
}
@Bean
public X509AuthenticationFilter x509FilterBean() throws Exception {
if (null == this.x509AuthenticationFilter) {
this.x509AuthenticationFilter = new X509AuthenticationFilter();
this.x509AuthenticationFilter.setContinueFilterChainOnUnsuccessfulAuthentication (false);
this.x509AuthenticationFilter.setAuthenticationManager(this.authenticationManagerBean(authenticationManager));
}
return this.x509AuthenticationFilter;
}
However, I’m receiving an error of type ‘No AuthenticationProvider found’ and I don’t understand why.
Stack trace below:
org.springframework.security.authentication. ProviderNotFoundException: No AuthenticationProvider found for org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken at org.springframework.security.authentication. ProviderManager.authenticate (ProviderManager.java:234) at org.springframework.security.web.authentication.preauth.Abstract PreAuthenticatedProcessingFilter.doAuthenticate (Abstract PreAuthenticatedProcessingFilter.java:200) at org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter.doFilter (Abstract PreAuthenticatedProcessingFilter.java:142) at org.springframework.security.web.ObservationFilterChain Decorator$ObservationFilter.wrapFilter (ObservationFilterChain Decorator.java:240)
at org.springframework.security.web.ObservationFilterChain Decorator$ObservationFilter.doFilter(ObservationFilterChain Decorator.java:227)
at org.springframework.security.web.ObservationFilterChain Decorator$VirtualFilterChain.doFilter (ObservationFilterChainDecorator.java:137) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter (LogoutFilter.java:107)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter (LogoutFilter.java:93)
at org.springframework.security.web. ObservationFilterChainDecorator$ObservationFilter.wrapFilter (ObservationFilterChain Decorator.java:240) at org.springframework.security.web. ObservationFilterChainDecorator $ObservationFilter.doFilter (ObservationFilterChain Decorator.java:227) at org.springframework.security.web.ObservationFilterChain Decorator $VirtualFilterChain.doFilter (ObservationFilterChain Decorator.java:137) at org.springframework.web.filter.CorsFilter.doFilterInternal (CorsFilter.java:91)
at org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:116)
at org.springframework.security.web. ObservationFilterChainDecorator$ObservationFilter.wrapFilter (ObservationFilterChain Decorator.java:240) org.springframework.security.web. ObservationFilterChainDecorator $ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) org.springframework.security.web. ObservationFilterChainDecorator $VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter (HeaderWriterFilter.java:90) at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal (HeaderWriterFilter.java:75)
at org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:116)
at org.springframework.security.web. ObservationFilterChainDecorator$ObservationFilter.wrapFilter (ObservationFilterChainDecorator.java:240) at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChain Decorator.java:227) at org.springframework.security.web. ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChain Decorator.java:137)
at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter (SecurityContextHolderFilter.java:69)
at org.springframework.security.web. ObservationFilterChainDecorator$ObservationFilter.wrapFilter (ObservationFilterChain Decorator.java:240) org.springframework.security.web. ObservationFilterChainDecorator $ObservationFilter.doFilter (ObservationFilterChain Decorator.java:227) org.springframework.security.web. ObservationFilterChainDecorator$VirtualFilterChain.doFilter (ObservationFilterChainDecorator.java:137)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal (WebAsyncManagerIntegrationFilter.java:62) at org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:116)
at org.springframework.security.web. ObservationFilterChainDecorator $ObservationFilter.wrapFilter (ObservationFilterChain Decorator.java:240) org.springframework.security.web. ObservationFilterChainDecorator $ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal (DisableEncodeUrlFilter.java:42)
at org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:116)
at org.springframework.security.web. ObservationFilterChainDecorator$ObservationFilter.wrapFilter (ObservationFilterChain Decorator.java:240)
at org.springframework.security.web.ObservationFilterChain Decorator$AroundFilterObservation$SimpleAround FilterObservation.lambda$wrap$0 (ObservationFilterChain Decorator.java:323) at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:224)
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
at org.springframework.security.web.FilterChainProxy.doFilterInternal (FilterChainProxy.java:233)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
at org.springframework.web.filter.Composite Filter$VirtualFilterChain.doFilter (CompositeFilter.java:113)
at org.springframework.web.servlet.handler.HandlerMapping Introspector.lambda$createCacheFilter$3 (HandlerMappingIntrospector.java:195)
at org.springframework.web.filter.Composite Filter$VirtualFilterChain.doFilter (CompositeFilter.java:113)
at org.springframework.web.filter.CompositeFilter.doFilter (CompositeFilter.java:74)
at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter (WebMvcSecurityConfiguration.java:230) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate (DelegatingFilterProxy.java:352)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter (DelegatingFilterProxy.java:268)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal (RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
at org.springframework.web.filter.FormContentFilter.doFilterInternal (FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal (ServerHttpObservationFilter.java:1 at org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:116)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal (CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:116)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) at org.apache.catalina.authenticator. AuthenticatorBase.invoke (AuthenticatorBase.java:482) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:93)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) at org.apache.coyote.http11.Http11 Processor.service(Http11Processor.java:391)
at org.apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.java:63)
at org.apache.coyote.Abstract Protocol$ConnectionHandler.process (AbstractProtocol.java:896) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun (NioEndpoint.java:1736)
at org.apache.tomcat.util.net.Socket ProcessorBase.run(Socket ProcessorBase.java:52)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) at java.base/java.lang.Thread.run(Thread.java:840)
I have already tried creating a Bean of type DaoAuthenticationProvider, as seen in other Stack Overflow answers.
@Bean
public DaoAuthenticationProvider authenticationProvider(UserDetailsService myUserService) {
DaoAuthenticationProvider auth = new DaoAuthenticationProvider();
auth.setUserDetailsService(myUserService);
auth.setPasswordEncoder(passwordEncoder());
return auth;
}
I’ve tried reading through the documentation and Spring Boot/JDK migration guides but I remain stuck on this issue for about a week. Any help is greatly appreciated.