1
resposta

Rotas @PostMapping retornam sempre 401 (Spring Security)

@RestController
@RequestMapping(value = "/api")
public class Controller {
    @PostMapping(value =  "/post")
    public String getPost(@RequestBody String name) {
        if (name.isEmpty()) {
            throw new RequestEmpty("Request vazio");
        } else {
            return "welcome" + name;
        }
    }
    
    @PostMapping(value = "/post-logado")
    public String postLogado(@RequestBody String name, Authentication authentication) {
        if (authentication.isAuthenticated()) {
            return "Welcome" + name;
        }
        return "Você não tem acesso.";
    }

    @GetMapping("/welcome")
    public String getwelcome() {
        return "Welcome";
    }
    
    @GetMapping("/logado")
    public String logad() {
        return "Estou logado";
    }
}
@Configuration
@EnableWebSecurity
public class Secutiry {
    @Bean
    public SecurityFilterChain config(HttpSecurity http) throws Exception {
            http
                
                .authorizeHttpRequests(custom -> {
                    custom.requestMatchers(HttpMethod.GET, "/api/welcome").permitAll();
                    custom.requestMatchers(HttpMethod.POST, "/api/post").permitAll();
                    custom.anyRequest().authenticated();
                }).httpBasic(Customizer.withDefaults());
                
                return http.build();
    }

}

Alguém sabe me dizer porque em todos os casos (autenticado ou não) minhas rotas marcadas como PostMapping sempre retornam error 401? As rotas marcadas como GetMapping funcionam pra ambos os casos como eu espero, mas as PostMapping ficam com esse comportamento.

1 resposta

Olá Victor!

O Spring Security habilita proteção contra CSRF por padrão para requisições POST. Tenta desabilitar temporariamente a proteção CSRF para ver se isso resolve o problema. Você pode fazer isso da seguinte forma:

@Bean
public SecurityFilterChain config(HttpSecurity http) throws Exception {
     http
         .csrf().disable() 
         .authorizeHttpRequests(custom -> {
             custom.requestMatchers(HttpMethod.GET, "/api/welcome").permitAll();
             custom.requestMatchers(HttpMethod.POST, "/api/post").permitAll();
             custom.anyRequest().authenticated();
         }).httpBasic(Customizer.withDefaults());
         
     return http.build();
}

Caso não seja isso, sinalize aqui para procurarmos outras soluções.

Espero ter ajudado. Abraços e bons estudos!