Spring Security fängt Controller-Ausnahmen ab und gibt immer 401 statt der tatsächlichen Fehlerantwort zurückJava

Java-Forum
Anonymous
 Spring Security fängt Controller-Ausnahmen ab und gibt immer 401 statt der tatsächlichen Fehlerantwort zurück

Post by Anonymous »

Ich bin ein Anfänger, der Spring Security lernt. Ich habe die JWT-Authentifizierung zusammen mit einem benutzerdefinierten AuthenticationEntryPoint und einem AccessDeniedHandler implementiert.
Wenn Spring Security nicht aktiviert ist, wird jede in meinem Controller ausgelöste Ausnahme korrekt als Fehlerantwort in Postman zurückgegeben.
Wenn Spring Security aktiviert ist, wird jedoch jede Ausnahme (sogar Geschäftslogik- oder Laufzeitausnahmen von Controllern) ausgelöst abgefangen und ich erhalte immer entweder 401 Unauthorized oder meine benutzerdefinierte Authentifizierungsfehlerantwort anstelle der eigentlichen Controller-Fehlerantwort.
Es scheint, dass Spring Security Ausnahmen behandelt, die nicht mit Authentifizierung oder Autorisierung zusammenhängen.
Meine Erwartung ist:
  • Authentifizierungsfehler → behandelt von AuthenticationEntryPoint
  • Autorisierungsfehler → behandelt durch AccessDeniedHandler
  • Alle anderen Ausnahmen → behandelt durch Controller oder globalen Ausnahmehandler
Aber derzeit werden alle Fehler über Spring Security weitergeleitet.
Unten ist mein Code:
Authentifizierungs-Einstiegspunkt-Implementierung:

Code: Select all

public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {

@Override
public void commence(HttpServletRequest request,
HttpServletResponse response,
AuthenticationException ex) throws IOException {

response.setStatus(HttpStatus.UNAUTHORIZED.value());
response.setContentType("application/json");
response.getWriter().write(
"{\"statusCode\":401,\"message\":\"" + ex.getMessage() + "\"}"
);
}
}
AccessDeniedHandler-Implementierung:

Code: Select all

public class CustomAccessDeniedHandler implements AccessDeniedHandler {

@Override
public void handle(HttpServletRequest request,
HttpServletResponse response,
AccessDeniedException ex) throws IOException {

response.setStatus(HttpStatus.FORBIDDEN.value());
response.setContentType("application/json");
response.getWriter().write(
"{\"statusCode\":403,\"message\":\""  + ex.getMessage() + "\"}"
);
}
}
JwtFilterImplementation:

Code: Select all

public class JwtAuthenticationFilter extends OncePerRequestFilter {

private final JwtService jwtService;
private final CustomUserDetailService userDetailService;

public JwtAuthenticationFilter(JwtService jwtService,
CustomUserDetailService userDetailService) {
this.jwtService = jwtService;
this.userDetailService = userDetailService;
}

@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain) throws IOException, jakarta.servlet.ServletException {

String authHeader = request.getHeader("Authorization");

if (authHeader == null || !authHeader.startsWith("Bearer ")) {
chain.doFilter(request, response);
return;
}

String token = authHeader.substring(7);

if (!jwtService.tokenValidation(token)) {
chain.doFilter(request, response);
return;
}

String email = jwtService.extractAllClaims(token).getSubject();
var userDetails = userDetailService.loadUserByUsername(email);

var authentication = new UsernamePasswordAuthenticationToken(
userDetails, null, userDetails.getAuthorities()
);

SecurityContextHolder.getContext().setAuthentication(authentication);
chain.doFilter(request, response);
}
}
SecurityConfig:

Code: Select all

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor

public class SecurityConfig {

private final JwtAuthenticationFilter jwtAuthenticationFilter;
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http.authorizeHttpRequests(auth ->
auth
.requestMatchers("/public/**").permitAll()
.requestMatchers("/user/**").authenticated()
.requestMatchers("/admin/**").hasRole("ADMIN"))
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.formLogin(AbstractHttpConfigurer::disable)
.httpBasic(AbstractHttpConfigurer::disable)
.csrf(AbstractHttpConfigurer::disable)
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
.exceptionHandling(ex ->  {
ex.authenticationEntryPoint(new CustomAuthenticationEntryPoint());
ex.accessDeniedHandler(new CustomAccessDeniedHandler());
})
.build();
}

@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
return config.getAuthenticationManager();
}

@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}

Code: Select all

2026-01-10T19:59:30.990+05:30 DEBUG 6644 --- [Authentication Application] [nio-8081-exec-1] o.a.c.a.jaspic.AuthConfigFactoryImpl     : Loading persistent provider registrations from [C:\Users\mayan\AppData\Local\Temp\tomcat.8081.11883709033744914683\conf\jaspic-providers.xml]
2026-01-10T19:59:31.052+05:30  INFO 6644 --- [Authentication Application] [nio-8081-exec-1] o.a.c.c.C.[.[localhost].[/auth-app]      : Initializing Spring DispatcherServlet 'dispatcherServlet'
2026-01-10T19:59:31.068+05:30  INFO 6644 --- [Authentication Application] [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        :     Initializing Servlet 'dispatcherServlet'
2026-01-10T19:59:31.068+05:30 DEBUG 6644 --- [Authentication Application] [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Detected StandardServletMultipartResolver
2026-01-10T19:59:31.083+05:30 DEBUG 6644 --- [Authentication Application] [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Detected AcceptHeaderLocaleResolver
2026-01-10T19:59:31.083+05:30 DEBUG 6644 --- [Authentication Application] [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Detected FixedThemeResolver
2026-01-10T19:59:31.244+05:30 DEBUG 6644 --- [Authentication Application] [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Detected org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator@3cd177b
2026-01-10T19:59:31.260+05:30 DEBUG 6644 --- [Authentication Application] [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Detected org.springframework.web.servlet.support.SessionFlashMapManager@4140e10a
2026-01-10T19:59:31.260+05:30 DEBUG 6644 --- [Authentication Application] [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : enableLoggingRequestDetails='false': request parameters and headers will be masked to prevent unsafe logging of potentially sensitive data
2026-01-10T19:59:31.260+05:30  INFO 6644 --- [Authentication Application] [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 192 ms
2026-01-10T19:59:31.518+05:30 DEBUG 6644 --- [Authentication Application] [nio-8081-exec-1] o.s.security.web.FilterChainProxy        : Securing GET /user/get
2026-01-10T19:59:31.604+05:30 DEBUG 6644 --- [Authentication Application] [nio-8081-exec-1] o.s.s.w.a.AnonymousAuthenticationFilter  : Set SecurityContextHolder to anonymous SecurityContext

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post