Puerta de enlace de microservicios (Puerta de enlace)

I. Introducción

        En mi opinión, en los microservicios, la puerta de enlace es lo más importante. No solo hace distribución de rutas y balanceo de carga para cada servicio. También puede garantizar la seguridad de todo nuestro microservicio. Tales como: ataque xxs , inyección sql . También hay algunos datos que deben verificarse en la solicitud de solicitud, entre dominios, manejo de excepciones globales, etc., todos los cuales deben escribirse en la puerta de enlace.

        La puerta de enlace no solo proporciona alta concurrencia y alta disponibilidad para microservicios. Y alta seguridad. Esta vez, resolveré el uso simple de Gateway para usted. (No puedo ir si es muy complicado).

Ataque xxs: es cambiar las páginas de nuestro sitio web inyectando lenguaje html o JavaScript en la solicitud para completar el propósito de los piratas informáticos.

        Todos sabemos que las páginas web se completan con lenguaje de etiquetas html y es fácil de aprender. Imaginemos que no tenemos intercepción xxs en aplicaciones web. Luego, una persona aleatoria coloca una etiqueta A junto a su nombre cuando registra su nombre. como:

<a href="xxxx.com">Daniel Wu</a>

        Entonces, en este momento, nuestro sitio web se convertirá en un lugar de reunión para p totales. Ellos hacen la publicidad, pero nosotros pisamos la máquina de coser. Que miedo.

        Esta es mi comprensión de xxs. No sé exactamente qué es.

---------------------------------------------------------

Inyección de SQL: similar a xxs anterior, pero la inyección de SQL es más difícil de distinguir. Debido a que select se usa como nombre de usuario para los usuarios en inglés, es normal que aparezca en los parámetros de entrada de la solicitud. No puedes matar todas las solicitudes con un solo palo. Entonces, en este momento, es necesario usar expresiones regulares para juzgar si los parámetros en la solicitud del usuario constituyen un delito, no, si la configuración constituye una declaración SQL que se puede ejecutar.

 2. Construcción del entorno

        1. Dependencia de expertos

<!--        Nacos服务注册发现-->
<dependency>
       <groupId>com.alibaba.cloud</groupId>
       <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!-- gateway依赖 没有版本,因为在父工程已指定springBoot版本 -->        
<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<!-- 因为我的配置文件是 bootstrap.yml 文件,spring boot版本高后不能自动读取需要这个依赖-->
<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

<!--        yml文件中无法通过lb 分发请求问题 解决依赖-->
<dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

        2. Archivo de configuración

server:
  port: 8000                            # 指定gateway网关服务端口
spring:
  application:
    name: spring-myself-gateway         #拟定服务名称
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848     #nacos服务注册地址
    gateway:
      routes:                           #Routes 路由分发功能          
        - id: spring-myself-user        #拟定路由名称,可任意。最好与对应服务,服务名称一致
          uri: lb://spring-myself-user  # lb:负载均衡。后面对应的那nacos注册服务名称。实则URL
          predicates:                    #前言
            - Path=/user/**            #当我们请求gateway服务时前缀如果是这个就会转发上面uri
          filters:                    
            - StripPrefix=1            # 过滤到一层请求 也就是 /user/  


# 我user服务模块端口是8001。 当我们请求 127.0.0.1:8000/user/System/doLogin 时他会通过网关进行转发,转发真实地址: 127.0.0.1:8001/System/doLogin

En tercer lugar, el uso de filtros globales.

        GateWay creó íntimamente la interfaz GlobalFilter para nosotros. Solo necesitamos implementar esta interfaz para completar todo el filtrado de solicitudes.

Código:

        Cree el paquete de filtros correspondiente en nuestro proyecto de puerta de enlace. Se utiliza para escribir todos los filtros.

@Component  //注入容器
@Slf4j      //日志打印(需要Lombok依赖)   全局过滤,优先等级(值越小越先执行)
public class TestFilter implements GlobalFilter, Ordered {

    //GlobalFilter接口的重写方法
    @Override                //入参理解:  本次请求交互信息,request等          管道
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //根据实际业务条件判断此请求是否继续执行
        if(1==1){
            //return chain.filter(exchange) 正常执行请求
            return chain.filter(exchange);
        }
        //返回null则是对此请求做了过滤,无效了。
        return null;
    }

    //Ordered接口重写,返回int值,值越小越先执行
    @Override
    public int getOrder() {
        return -1;
    }
}

Tal filtro global está escrito. Llevar a cabo la liberación correspondiente y filtrar de acuerdo con el negocio real

//Obtener la solicitud de la información de interacción 
ServerHttpRequest request = exchange.getRequest();

//Obtenga la respuesta de la información de interacción

Respuesta ServerHttpResponse = exchange.getResponse();

//Ejemplo: Tomar información del token del intercambio

Cadena token = exchange.getRequest().getHeaders().getFirst("token");

Control de acceso (lista blanca y negra)

               Algunas solicitudes en el proyecto no requieren filtrado de permisos, porque el filtrado de permisos de tales interfaces hará que el proceso principal falle. Tales como: registro, inicio de sesión y otras interfaces. Tengo todos los permisos y el token y aun así me registro, ¿por qué inicio sesión? Entonces, en este punto, debemos configurar la URL de la lista blanca en nuestro archivo yml. directamente en la clase. yml. O los datos servirán. Mire el proyecto, siempre que se pueda leer la colección de la lista blanca. Generalmente, se configura en el centro de configuración, no necesita reiniciar el servicio y es conveniente para la administración. Utilice la anotación @ConfigurationProperties para leerlo del archivo yml y compararlo con la solicitud de URL actual. Si coincide, se publicará directamente sin filtrado de permisos.

        Los filtros globales se pueden usar para prevenir ataques xss, listas negras y listas blancas. Para configurar la información entre dominios, debe implementarse a través del filtro WebFilter.

        Configuración entre dominios: consulte ruoyi-plus

@Component
public class GlobalCorsFilter implements WebFilter, Ordered {

    /**
     * 这里为支持的请求头,如果有自定义的header字段请自己添加
     */
    private static final String ALLOWED_HEADERS = "X-Requested-With, Content-Language, Content-Type, Authorization, credential, X-XSRF-TOKEN, isToken, token, Admin-Token, App-Token";
    private static final String ALLOWED_METHODS = "GET,POST,PUT,DELETE,OPTIONS,HEAD";
    private static final String ALLOWED_ORIGIN = "*";
    private static final String ALLOWED_EXPOSE = "*";
    private static final String MAX_AGE = "18000L";

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        if (CorsUtils.isCorsRequest(request)) {
            ServerHttpResponse response = exchange.getResponse();
            HttpHeaders headers = response.getHeaders();
            headers.add("Access-Control-Allow-Headers", ALLOWED_HEADERS);
            headers.add("Access-Control-Allow-Methods", ALLOWED_METHODS);
            headers.add("Access-Control-Allow-Origin", ALLOWED_ORIGIN);
            headers.add("Access-Control-Expose-Headers", ALLOWED_EXPOSE);
            headers.add("Access-Control-Max-Age", MAX_AGE);
            headers.add("Access-Control-Allow-Credentials", "true");
            if (request.getMethod() == HttpMethod.OPTIONS) {
                response.setStatusCode(HttpStatus.OK);
                return Mono.empty();
            }
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }
}

Resumir:

        De hecho, las funciones que deben configurarse en la puerta de enlace son más de las que mencioné anteriormente. La configuración en la puerta de enlace también es engorrosa. Con mi fuerza actual, es difícil decir bien. Aprendamos sobre la marcha.

Supongo que te gusta

Origin blog.csdn.net/m0_58907154/article/details/130107884
Recomendado
Clasificación