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.

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
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!