2016-06-28 3 views
1

Я создаю приложение с пружинным ботинком (на http://localhost:8080) и угловым (на http://localhost:80).Проблемы с CORS с пружинной защитой

Внутренний и внутренний код обслуживаются двумя разными серверами. Чтобы избежать проблем с CORS, я использовал промежуточный сервер nginx, но я больше не удовлетворен этим решением. Следовательно, я должен разрешить CORS.

я позволил CORS во всем мире с этими линиями:

@Configuration 
public class WebMvcConfiguration extends WebMvcConfigurerAdapter { 

    @Override 
    public void addCorsMappings(CorsRegistry registry) { 
    registry.addMapping("/**") 
     .allowedOrigins("http://localhost") 
     .allowCredentials(true) 
    ; 
    } 
} 

Это работы для каждого маршрутов для маршрута аутентификации который обрабатывается с весны безопасности, за исключением:

public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
    http 
     .formLogin() 
     .successHandler(successHandler()) 
     .failureHandler(failureHandler()) 
    //[...] 
    } 

    private AuthenticationSuccessHandler successHandler() { 
    return (httpServletRequest, httpServletResponse, authentication) -> 
     httpServletResponse.setStatus(HttpServletResponse.SC_OK); 
    } 

    private AuthenticationFailureHandler failureHandler() { 
    return (httpServletRequest, httpServletResponse, e) -> { 
     httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
    }; 
} 

Вот является код, который отправляет запрос на внешнюю часть:

$http.post('http://localhost:8080/api/login', $.param({'username': username, 'password': password}), 
      {headers: {'content-type': 'application/x-www-form-urlencoded'}} 
).then(function() {}) 
.catch(function(error) {}; 

Если я ввожу правильный пароль, код ответа HTTP (который я могу видеть на консоли Chrome) равен 200, но я все еще добираюсь до блока catch (с ошибкой.status = -1), и я вижу это сообщение об ошибке в консоли:

XMLHttpRequest не может загрузить http://localhost:8080/api/login. В запрошенном ресурсе нет заголовка «Access-Control-Allow-Origin». Происхождение 'http://localhost', следовательно, не допускается.

Если я ввести неправильный пароль, который я также достигнуть блока поймать с этим сообщением об ошибке:

XMLHttpRequest не может загрузить http://localhost:8080/api/login. В запрошенном ресурсе нет заголовка «Access-Control-Allow-Origin». Происхождение 'http://localhost', следовательно, не допускается. Ответ имел код состояния HTTP 401.

Я также замечаю, что заголовки ответа CORS отсутствуют, когда я вызываю конечную точку аутентификации.

Любые идеи?

EDIT: он работает, если вручную добавлять заголовки в пользовательский обработчик. Я бы предпочел, чтобы Spring-security могла учитывать глобальную конфигурацию CORS.

+0

http://stackoverflow.com/questions/35035055/spring-boot-and-cors/35040051#35040051 возможно, это может сэкономить ваше время :) –

ответ

0

Из моего опыта вам нужно будет указать номер порта в CORS, сообщение об ошибке из браузера немного вводит в заблуждение.

Вы можете проверить это, проверив сеть и проверив поле Origin ваших заголовков запроса. Значение в Access-Control-Allow-Origin ваших заголовков ответов должно соответствовать точному протоколу и порту.

0

Если бы точно такая же проблема, которую вы могли бы сделать, то

  1. @CrossOrigin(origins = "http://localhost:8080") добавьте это в методы обслуживания. Идея этого заключается в том, что вы разрешаете запрос CORS через свое обслуживание.
  2. Используйте JSONP, но это имеет определенные ограничения. Также я не смог его реализовать, поэтому я использовал вышеприведенный вариант.
Смежные вопросы