1
resposta

[Dúvida] Dúvida nos Request Machers

Criei uma classe que renderiza uma página estática React no meu projeto. ( Renderiza o index.html gerado no build )

Então, para minhas APIs Rest, padronizei para que todos os RestControllers sejam mapeados para /api/rota-da-api, e todas as outras rotas renderizam a página em react.

Para isso, criei um Controller MVC e coloquei o seguinte mapeamento de rotas:

@GetMapping(value = {
            "/{caminho:^(?!api)(?!.*\\.[a-zA-Z0-9]+$).*$}",
            "/{caminho:^(?!api)(?!.*\\.[a-zA-Z0-9]+$).*$}/{final:^(?!api)(?!.*\\.[a-zA-Z0-9]+$).*$}",
            "/{caminho:^(?!api)(?!.*\\.[a-zA-Z0-9]+$).*$}/*/{final:^(?!api)(?!.*\\.[a-zA-Z0-9]+$).*$}"
    })
    public ResponseEntity renderizarPagina() {
        return this.renderizarReact();
    }

 @GetMapping(value = "/")
    public ResponseEntity r2() {
        return this.renderizarReact();
    }

Funcionou, e todos os requests que começam com /api não caem nessas rotas, logo, na hora de configurar, eu fiz conforme o vídeo:

@Configuration
@EnableWebSecurity
//@EnableMethodSecurity(securedEnabled = true)
public class AutenticacaoConfiguracoes {

    @Autowired
    private FiltroAPI securityFilter;
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
        return httpSecurity
                .csrf(AbstractHttpConfigurer::disable)
                .cors(AbstractHttpConfigurer::disable)
                .sessionManagement(sess->sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeHttpRequests(it->{
                it.requestMatchers(HttpMethod.POST,"/api/auth/login").permitAll();
                it.requestMatchers(HttpMethod.GET, "/{caminho:^(?!api)(?!.*\\.[a-zA-Z0-9]+$).*$}",
                        "/{caminho:^(?!api)(?!.*\\.[a-zA-Z0-9]+$).*$}/{final:^(?!api)(?!.*\\.[a-zA-Z0-9]+$).*$}",
                        "/{caminho:^(?!api)(?!.*\\.[a-zA-Z0-9]+$).*$}/*/{final:^(?!api)(?!.*\\.[a-zA-Z0-9]+$).*$}").permitAll();


                it.anyRequest().authenticated();
                })
                .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
                .build();
    }

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration conf) throws Exception {
        return conf.getAuthenticationManager();
    }

    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }


}

Porém, o regex da página estática não está funcionando como deveria nas configurações de segurança, ele só consegue responder a página estática do controller se eu tiver com o JWT configurado. Qual o erro no código?

1 resposta

Olá, João! Parece que você está fazendo um ótimo trabalho com o Spring Boot e React, parabéns! Vamos ver se consigo te ajudar com essa questão.

Pelo que entendi, você está tendo problemas com as rotas estáticas quando o JWT não está configurado, certo? Isso pode estar acontecendo porque o Spring Security está interpretando que todas as requisições precisam ser autenticadas, inclusive as rotas estáticas.

No seu código, você tem a seguinte linha:

it.anyRequest().authenticated();

Essa linha está dizendo ao Spring Security que todas as requisições, que não foram correspondidas anteriormente, precisam ser autenticadas. Isso inclui suas rotas estáticas.

Uma solução possível seria você adicionar as rotas estáticas na lista de permitidas antes de definir que qualquer outra requisição precisa ser autenticada. Para isso, você poderia adicionar um método que ignore as rotas estáticas. Veja um exemplo:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/**/*.{js,html,css}");
}

Neste exemplo, todas as rotas que terminam com .js, .html e .css serão ignoradas pelo Spring Security.

Espero que essa sugestão possa te ajudar. Mas lembre-se, essa é apenas uma sugestão e pode não resolver completamente o problema, pois existem muitos fatores envolvidos que podem estar causando esse comportamento.

Espero ter ajudado e bons estudos!