1
resposta

RequestMatchers permitAll não está funcionando

A minha SecurityFilterChain da aplicação está configurada para permitir requisições POST em caminhos específicos. No entanto, quando faço essas requisições, ele não reconhece o caminho e direciona a requisição para o meu filtro de segurança para filtragem, o que não deveria acontecer.

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    return http.csrf().disable()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and().authorizeRequests()
        .antMatchers(HttpMethod.POST, "/login").permitAll() 
        .antMatchers("/v3/api-docs/**", "/swagger-ui.html", "/swagger-ui/**").permitAll()
        .anyRequest().authenticated()
        .and().addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
        .build();
}

Um dos meus Controllers:

@RestController
@RequestMapping("/cadastrar")
public class CadastroController {
    @Autowired
    private CadastroService cadastroService;
    
    @PostMapping("/cadastro-usuario")
    @Transactional
    public ResponseEntity<Object> cadastrar(@RequestBody @Valid DadosCadastroUsuario dados ){
        try{
            cadastroService.cadastrarUsuario(dados);
            return ResponseEntity.status(HttpStatus.CREATED).header("Location", "/login").build();
        } catch (Exception e){
           return ResponseEntity.badRequest().body(e.getMessage());
        }
    }
    @PostMapping("/cadastro-loja")
    @Transactional
    public ResponseEntity<Object> cadastrar(@RequestBody @Valid DadosCadastroLoja dados) throws Exception {
        try{
            cadastroService.cadastrarLoja(dados);
            return ResponseEntity.status(HttpStatus.CREATED).header("Location", "/login").build();
        } catch (Exception e) {
            return ResponseEntity.badRequest().body(e.getMessage());
        }
    }
}

A URL que estou usando para minha requisição é: https://localhost:443/cadastrar/cadastro-usuario. Já verifiquei o caminho para o qual estou fazendo a requisição e o controlador, mas tudo parece estar correto.

1 resposta

Olá, Nicolas!

Pelo código que você compartilhou, parece que a configuração do SecurityFilterChain está correta. No entanto, é possível que o problema esteja relacionado à ordem em que os filtros estão sendo aplicados.

Uma possível solução é mover o método addFilterBefore para antes do método anyRequest().authenticated(), dessa forma:

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    return http.csrf().disable()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and().authorizeRequests()
        .antMatchers(HttpMethod.POST, "/login").permitAll() 
        .antMatchers("/v3/api-docs/**", "/swagger-ui.html", "/swagger-ui/**").permitAll()
        .and().addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
        .anyRequest().authenticated()
        .build();
}

Isso garante que o filtro de segurança seja aplicado antes da autenticação ser verificada.

Além disso, verifique se o caminho /cadastrar/cadastro-usuario está correto e se não há nenhum outro filtro ou interceptador que esteja interferindo no processo.

Espero que isso resolva o seu problema! Se tiver mais alguma dúvida, é só me dizer. Espero ter ajudado e bons estudos!