Введение. Общий доступ к ресурсам из разных источников (cors) может ослабить политику браузера в отношении одного и того же источника, позволяя обмениваться данными между разными веб-сайтами и разными серверами через браузер.
1. Предпосылки
В настоящее время разделение микросервисов стало тенденцией, и большинство компаний скорректировали микросервисную архитектуру своих программных продуктов. Продукты сначала делятся на бизнес и модули, и большинство из них также настраивается на разделение фронтенда и бекенда.
Неизбежная проблема разделения службы: запрос междоменных проблем Для междоменных проблем мы заранее организовали данные.
-
Что такое междоменный домен?
-
Будет ли запрашивать пересекать домен?
-
Что именно решает совместное использование ресурсов между источниками (cors)?
По этим вопросам см.Что именно решает междоменное совместное использование ресурсов (cors) в Spring Cloud? 》
Также существует решение междоменных проблем после включения междоменного совместного использования ресурсов (cors).
-
Каков будет эффект?
-
Будет ли оно атаковано?
-
Какие есть способы атаковать?
Для этой серии вопросов см.«После того как микросервисы активируют междоменное совместное использование ресурсов (cors), будут ли они действительно атакованы? 》
Во-вторых, фактический боевой обмен
▐ Определить конфигурацию
читатьCorsConfigurationИсходный код можно найти в конфигурации CORS.
-
allowedOriginsСписок разрешенных доменов -
allowedMethodsсписок разрешенных методов -
resolvedMethodsРазрешить список доступа к заголовку -
allowedHeadersразрешенные заголовки -
exposedHeadersРасширенный заголовок запроса -
allowCredentialsразрешить учетные данные
ОснованиеCorsConfigurationОпределение настраиваемой информации о междоменной конфигурацииCorsConfigвыполнитьCorsConfigurationSource
## Csrf 安全拦截
kmss.security.referers = http:xxx.com.cn
## 跨域配置
## 允许访问的origin 列表
kmss.security.allowedOrigins = http://www.baidu.com,http://www.google.com
## 允许方法的方法列表
kmss.security.allowedMethods = GET,POST,HEAD,TRACE,OPTION
## 允许的请求头,一般不开启
kmss.security.allowedHeaders =
Обратите внимание на ссылки на аннотации при настройке@ConfigurationPropertiesПочему здесь используется одна аннотация, а не вводится напрямую в контейнер компонента? Анализ этого вопроса можно прочитать«Как работает @EnableConfigurationProperties»
▐ Реализуйте метод getCorsConfiguration
информация о конфигурацииCorsConfigПосле получения основной информацииgetCorsConfigurationметод
@Overridepublic CorsConfiguration getCorsConfiguration(HttpServletRequest request) { CorsConfiguration configuration = null; // 根据配置结合业务写入CORS 配置 /** * allowedOrigins 允许访问域名列表 * allowedMethods 允许方法列表 * resolvedMethods 允许头访问列表 * allowedHeaders 允许的请求头 * exposedHeaders 拓展请求头 * allowCredentials 允许凭据 **/ return configuration;}
▐ Определите перехватчик CorsSecurityFilter
/**
* cors安全
*/
public class CorsSecurityFilter extends CorsFilter {
/**
* 构造函数
*/
public CorsSecurityFilter(CorsConfigurationSource configSource) {
super(configSource);
}
/**
* 避免类不被执行
*/
@Override
protected String getFilterName() {
return null;
}
}
▐ Перехватчик веб-потока
Определите перехватчик веб-потока, чтобы единообразно обрабатывать переменные потока! У этого же сервиса точно не будет междоменных проблем. Такие проблемы возникают только при звонках между разными службами. Помните, что вы анализировали ранее"Как добавить traceId в выходной журнал для отслеживания ссылок"а также"Как обеспечить безопасность звонков между различными микросервисами?**"** Проблема передачи переменной потока запроса вызова RPC между службами.
/**
* Web线程拦截器,用于统一处理线程变量
*
* 该过滤器执行顺序早于springsecurity的过滤器
*/
public class WebThreadFilter extends CompositeFilterProxy {
/**
* 应用上下文
*/
private ApplicationContext applicationContext;
/**
* 跨站安全配置
*/
private CorsConfig corsConfig;
/**
* http相关配置
*/
private HttpConfig httpConfig;
public WebThreadFilter(List<IWebFilterDef> filterDefs,
List<SystemTag> systemTags) {
super(filterDefs, systemTags);
}
@Override
protected void initFilterBean() throws ServletException {
applicationContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
corsConfig = applicationContext.getBean(CorsConfig.class);
//...
super.initFilterBean();
}
@Override
protected void handleInnerFilters(List<Filter> innerFilters) {
super.handleInnerFilters(innerFilters);
//...
innerFilters.add(0, new CorsSecurityFilter(corsConfig));
}
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain) throws ServletException, IOException {
request = new ValidatorHttpServletRequestWrapper((HttpServletRequest) request,httpConfig);
compositeFilter.doFilter(request, response, chain);
}
}
3. Резюме
Решение междоменной проблемы между основными микросервисами в этой статье, почему возникает междоменная проблема и какие режимы атаки будут после включения междоменной проблемы
Он был постепенно проанализирован в предыдущих статьях, и есть три основных шага для решения междоменной проблемы микросервисов.
-
Переопределить информацию о конфигурации CorsConfig на основе CorsConfiguration в Spring-web.
-
Повторно реализовать перехватчик CorsSecurityFilter на основе CorsFilter в Spring-web.
-
Реализовать проблемы перехвата и передачи переменных потока
Сосредоточьтесь на оригинальном совместном использовании и обмене высококачественными техническими статьями и откажитесь от гидрологических и программных статей.
Первый адрес:Микросервисная архитектура | Как решить междоменные проблемы между сервисами?