Глобальная конфигурация Spring Boot CORS не работает для входа в систему с использованием XMLHttpRequest - PullRequest
0 голосов
/ 01 июля 2019

Я сделал простой API, который использует логин. Это моя конфигурация безопасности:

       @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
.antMatcher("/**").authorizeRequests().anyRequest().authenticated()
                    .and()
                    .exceptionHandling()
                    .authenticationEntryPoint(new Http403ForbiddenEntryPoint())
                    .and()
                    .httpBasic()
                    .and()
                    .formLogin()
                    .failureHandler(customAuthenticationFailureHandler)
                    .usernameParameter("email")
                    .passwordParameter("password")
                    .successHandler(authenticationSuccessHandler)
                    .and()
                    .csrf().disable()
            ;
        }

С этим WebMvcConfigurer:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry
                .addMapping("/login")
                .allowedMethods("POST")
                .allowedOrigins("http://localhost:9000")
                .allowCredentials(true);
        registry
                .addMapping("/api/**")
                .allowedMethods("*")
                .allowedOrigins("*")
                .allowCredentials(false);
    }
}

Теперь, используя POSTMAN или curl, логин работает без проблем:

$ curl -c cookie.txt -X POST -i -d "email=email@email.com" -d "password=1234567890" http://localhost:8080/login
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   317  100   268  100    49    268     49  0:00:01 --:--:--  0:00:01  2536
**HTTP/1.1 200**

Но когда я пытаюсь использовать XMLHttpRequest с этой тестовой страницей:

$(document).ready(function() {
    var data = null;

    var xhr = new XMLHttpRequest();
    xhr.withCredentials = true;

    xhr.addEventListener("readystatechange", function () {
      if (this.readyState === 4) {
        console.log("xhr.status:"+xhr.status);
        console.log("this.responseText:"+this.responseText);
      }
    });

    var url = "http://localhost:8080/login";

    var params = 'email=email@email.com&password=1234567890';
    xhr.open('POST', url, true);

    //Send the proper header information along with the request
    xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    xhr.setRequestHeader("cache-control", "no-cache");
    xhr.send(params);
});

Это работает на веб-сервере на порту 9000.

Но это ошибка, которую я получаю:

enter image description here

А также нет уверенности, почему весной попробуйте отправить страницу с ошибкой:

2019-07-01 08:17:35.069 DEBUG 1096 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : "ERROR" dispatch for OPTIONS "/error", parameters={}
2019-07-01 08:17:35.070 DEBUG 1096 --- [nio-8080-exec-4] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to public void org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$EmptyHandler.handle()
2019-07-01 08:17:35.071 DEBUG 1096 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : Exiting from "ERROR" dispatch, status 401
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...