2016-11-11 5 views
1

У меня есть приложение весной, использующее Spring Security для обработки аутентификации. Наше приложение должно обеспечить поддержку простого совместного использования ресурсов Cross Origin, доступ к приложению можно получить из «http://myApplication.myDomain.net» и «http://www.myApplication.myDomain.net», я настроил свой простой фильтр CORS, чтобы разрешить несколько истоков запросов, поэтому эти два домена будут иметь Access- Заголовок ответа на запрос Control-Allow-Origin. Проблема в том, что при доступе к приложению из этого домена «http://myApplication.myDomain.net» работает отлично, но когда я пытаюсь получить доступ к приложению отсюда «http://www.myApplication.myDomain.net« Я могу только войти в систему, но промежуточный следующий запрос для отображения главной тире -board получает 403 - Запрещено: доступ запрещен. Я использую AngularJS и хрюкать, от Angular все запросы сделаны до http://myApplication.myDomain:8087/api/ ....Spring Security - простая проверка подлинности CORS

Мой вопрос в том, как я могу добавить для поддержки обоих доменов? Почему работает запрос регистрации, но запрещены какие-либо дальнейшие действия?

Спасибо.

ответ

1

Добавить перехватчик

public class CorsInterceptor extends HandlerInterceptorAdapter { 

public static final String CREDENTIALS_NAME = "Access-Control-Allow-Credentials"; 
public static final String ORIGIN_NAME = "Access-Control-Allow-Origin"; 
public static final String METHODS_NAME = "Access-Control-Allow-Methods"; 
public static final String HEADERS_NAME = "Access-Control-Allow-Headers"; 
public static final String MAX_AGE_NAME = "Access-Control-Max-Age"; 
public static final String REQUEST_ORIGIN_NAME = "Origin"; 

private final List<String> origins; 

    public CorsInterceptor(List<String> origins) { 
     this.origins = origins; 
    } 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
     response.setHeader(CREDENTIALS_NAME, "true"); 
     response.setHeader(METHODS_NAME, "GET, OPTIONS, POST, PUT, DELETE"); 
     response.setHeader(HEADERS_NAME, "Origin, X-Requested-With, Content-Type, Accept"); 
     response.setHeader(MAX_AGE_NAME, "3600"); 

     String origin = request.getHeader(REQUEST_ORIGIN_NAME); 
     if (origins.contains(origin)) { 
      response.setHeader(ORIGIN_NAME, origin); 
      return true; // Proceed 
     } 

     return false; 
    } 

} 

в Config

public class WebMvcConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(new CorsInterceptor(Arrays.asList("'http://myApplication.myDomain.net","http://www.myApplication.myDomain.net"))); 
    } 

    ... 

} 
+1

Спасибо за ваш ответ, имеет смысл для меня, я реализовал свой и, кажется, предложение приемлемо работать на среде разработки, однако Я должен попробовать его в производственной среде, чтобы отметить его как правильный ответ, потому что сейчас это 1-й голос. Еще раз спасибо. –

+0

К сожалению, это не исправило мою проблему, я, наконец, нашел проблему, связанную с токенами CSRF, которые используют приложение для обработки аутентификации, по какой-то причине CREF-токен-cookie не устанавливается для перекрестных доменов, даже жестко Я устанавливаю домен cookie явно, только для локального домена, запрос на вход, конечно, отфильтровывается из фильтров CSRF. Как бы то ни было, это решение очень эффективно, если вам нужен перехватчик по запросу. –

Смежные вопросы