2
respostas

Erro 403 após o build ao tentar acessar o arquivo em modo de produção

No modo de desenvolvimento eu rodo minha aplicação com vue-cli no front na porta 3000 e redireciono para a porta 8080 que é onde meu spring boot roda; Nesse método roda tudo normal e tbm consigo fazer requisições normais com o insomnia.

![](print do insomnia](https://cdn1.gnarususercontent.com.br/1/4155945/9979d596-d107-4cb6-82be-f8ce573b51f5.png) )

Porém quando vai para a produção não consigo acessar meu arquivos statitos da parte do front que me permitem fazer o login e tudo o mais O login deveria ser feito por esse endereco http://localhost:8080/login ou http://localhost:8080 somente que ele redireciona pra pagina de login quando vê que nao tem token; Até tenho uma versão da aplicação em produção que eu tava estudando conf de servidor antes de colocar o springboot e estava acessando normalmente.

qual conf eu preciso incluir aqui para liberar o acesso aos arquivos html da pasta resources/static?

link do repo onde estou trabalhando https://github.com/jonasroder/microbiome-lab-ufu/tree/login

quando eu uso esse código aqui liberando tudo. eu volto a conseguir acessar a aplicação em modo de produção pelo navegador

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
        return httpSecurity
                .cors(cors -> cors.configurationSource(corsConfigurationSource()))
                .csrf(csrf -> csrf.disable())
                .authorizeHttpRequests(authorize -> authorize
                        .requestMatchers("/**").permitAll()
                )
                .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .build();
    }

obs (Muitos dos métodos aprensentados na aula não deram certo para mim pq a versão do meu sprin-security é 6.1.5, aí fui adapatando e olhando outros materias.)

@Configuration
@EnableWebSecurity
public class SecurityConfiguration {

    @Autowired
    SecurityFilter securityFilter;

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
        return httpSecurity
                .cors(cors -> cors.configurationSource(corsConfigurationSource()))
                .csrf(csrf -> csrf.disable())
                .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeHttpRequests(authorize->authorize
                        .requestMatchers(HttpMethod.POST, "/api/authenticate/login").permitAll()
                        .requestMatchers(HttpMethod.POST, "/api/authenticate/register").permitAll()
                        //.requestMatchers(HttpMethod.POST, "/product").hasRole("ROLE_ADMIN")
                        .anyRequest().authenticated()
                )
                .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
                .build();
    }


    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOriginPatterns(List.of("http://localhost:[*]", "https://*.saudeemequilibrioufu.com.br"));
        configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"));
        configuration.setAllowedHeaders(List.of("*"));
        configuration.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }


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

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

Desde já agradeço

2 respostas

Oi!

Fala aí!

Parece que na produção os arquivos estáticos não estão sendo acessados como deveriam, né? Pelo que entendi, você tá usando o Spring Security para a autenticação, e quando você libera tudo (como no exemplo que você mostrou), funciona, mas obviamente não é a solução mais segura.

O problema pode ser que o Spring Security esteja bloqueando o acesso aos arquivos estáticos na produção.

Parece que você já configurou o CORS pra permitir as origens que precisa, o que é um bom começo. Agora, talvez seja interessante ajustar a configuração de autorização para garantir que os recursos estáticos sejam liberados.

Tenta adicionar algo assim na sua configuração do SecurityConfiguration:

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

Isso basicamente diz para o Spring Security ignorar as requisições para os recursos na pasta "/resources/", que parece ser onde estão seus arquivos estáticos.

No seu caso, talvez algo assim resolva:

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

Lembrando de ajustar o "/static/**" de acordo com o caminho dos seus arquivos estáticos.

Dá uma testada e vê se resolve o problema. Boa sorte! Se não der certo, estamos aqui pra tentar outras soluções.

pior que eu tinha tentado isso já e não deu

eu vou usando assim por enquanto

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
        return httpSecurity
                .cors(AbstractHttpConfigurer::disable)
                .csrf(AbstractHttpConfigurer::disable)
                .authorizeHttpRequests(authorize -> authorize
                        .requestMatchers(HttpMethod.POST, "/api/authenticate/login").permitAll()
                        .requestMatchers(HttpMethod.POST, "/api/authenticate/register").permitAll()
                        .requestMatchers("/api/**").authenticated()
                        .anyRequest().permitAll()
                )
                .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .build();
    }

Desse jeito minha aplicação rodou em produção; Só não ta muito seguro né. Tenho que tomar muito cuidado parapra não ter nenhum endpoint sem o /api/.

mas muito obrigado pela sugestão;