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?