I have the following config in Spring Boot 3.1.4. As you see I set to permit all requests to auth/login.
package com.example.demo.Auth;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
@Configuration
public class AuthConfig {
@Autowired
private JwtFilter jwtFilter;
@Bean
public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
return httpSecurity
.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)
.authorizeHttpRequests(authorizationManagerRequestMatcherRegistry -> {
authorizationManagerRequestMatcherRegistry.requestMatchers("/auth/registration").permitAll();
authorizationManagerRequestMatcherRegistry.requestMatchers("/auth/login").permitAll();
authorizationManagerRequestMatcherRegistry.anyRequest().authenticated();
})
.httpBasic(AbstractHttpConfigurer::disable)
.csrf(AbstractHttpConfigurer::disable)
.build();
}
}
This is the http request
POST localhost:8080/auth/login
Content-Type: application/json
{
"userName": "jane_doe",
"password": "pw12345789"
}
Expected:
- I expect the request to pass and to be processed by the controller.
Actual:
- The request goes anyway through the jwtFilter and AuthorizationFilter which finally returns an 403.
My config doesnt seem to work. Why does the request go through the filter if it is the chain is configured to bypass all requests to that path?
I believe the issue here is the
AuthServiceis throwing an exception when the username provided in the HTTP request isn't found. When theResponseStatusExceptionis thrown, spring-boot's default error handling is triggered, which performs a server-side redirect to/error. You can see this by enabling logging for spring-security:With the above logging configuration, you'll see something like this in the logs:
The redirect to
/errorengages spring-security because it is not specified in theSecurityFilterChainas an unauthenticated route. You can add the following to yourSecurityFilterChainbean:Or provide your own error handling logic as outlined by spring-boot's documentation (like providing your own
@ControllerAdvicebean)