Микросервисная архитектура | Как решить междоменные проблемы между сервисами?

задняя часть Архитектура
Микросервисная архитектура | Как решить междоменные проблемы между сервисами?

Введение. Общий доступ к ресурсам из разных источников (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.

  • Реализовать проблемы перехвата и передачи переменных потока

Сосредоточьтесь на оригинальном совместном использовании и обмене высококачественными техническими статьями и откажитесь от гидрологических и программных статей.

Первый адрес:Микросервисная архитектура | Как решить междоменные проблемы между сервисами?