403 ошибка при запросе POST или PUT во время разработки Spring RestAPI

#spring #spring-security #cors #http-status-code-403

Вопрос:

Я пытаюсь реализовать и использовать Rest API в проекте, к которому применяется Spring 5 Spring Security 5.

При тестировании с почтальоном после локального запуска Tomcat

url: http://localhost:8080/api~

Было подтверждено, что такие запросы, как get, post и put, работают нормально.

Я загрузил этот проект на https-сервер и во время тестирования api на сервере в local Postman,

В запросах, таких как put и post, произошла ошибка 403, запрещенная, за исключением запросов get.

Когда я погуглил, там было написано, что проблема csrf Spring Security проблема обработки cors.


Поэтому я изменил код вот так.

  • WebSecurityConfig
 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                    .authorizeRequests()
                    .antMatchers("/").permitAll()                   
                   ~
                   .anyRequest().permitAll()
                .and()
                    .formLogin()
                 ~                  
                .and()
                    .logout()
               ~
                .and()
                    .httpBasic().disable().cors().configurationSource(corsConfigurationSource())
                .and()
                    .sessionManagement()
                    ~
    }

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", corsConfiguration);
        return source;
    }
 
  • WebMvcConfig
 @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedOrigins("*");
    }
 
  • Контроллер
 @CrossOrigin("*")
 

Но в запросе freflight он обычно возвращает 200, но в этом запросе я все равно получаю 403.

Какая часть неверна? Я был бы признателен, если бы вы дали мне знать 🙂

Комментарии:

1. Привет, Мэнди, добро пожаловать в StackOverflow. На самом деле это не ответ. Пожалуйста, отредактируйте свой исходный вопрос, если вы хотите добавить больше информации или привести другой пример

Ответ №1:

В вашей конфигурации добавьте фильтр add Cors через конструктор HttpSecurity. т. е.

 Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors()
        .........
 

Это позволит выполнять предварительные запросы cors, которые используются PUT и POST.
вам не нужно включать источник CorsConfigurationSource, просто убедитесь, что в ваших контроллерах также есть аннотация @CrossOrigin.