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
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() + "\"}"
);
}
}
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() + "\"}"
);
}
}
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);
}
}
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
Mobile version