The issue is that method-level security annotations like @PreAuthorize require explicit enabling. Add @EnableMethodSecurity to your security configuration class:
@Configuration
@EnableMethodSecurity
public class SecurityConfig {
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.csrf(csrf -> csrf.disable())
.authorizeHttpRequests(auth ->
auth.requestMatchers("/v1/api/public/**").permitAll()
.requestMatchers("/v1/api/authorized/**").hasRole("USER")
.anyRequest().authenticated())
.sessionManagement(session ->
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
return http.build();
}
}
This enables method-level security, allowing @PreAuthorize to work correctly. For more details, refer to the Spring Security Documentation.