From 7721ee369c9aa423d3004c5f47d8cdce83bd927d Mon Sep 17 00:00:00 2001 From: zhouzhou <754746838@qq.com> Date: Sun, 10 Dec 2023 14:58:21 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/encodings.xml | 1 + .../bwie/common/domain/HealthEducation.java | 1 + bwie-gateway/.gitignore | 38 +++++++ bwie-gateway/pom.xml | 42 ++++++++ .../java/com/bwie/GateWayApplication.java | 19 ++++ .../gateway/config/IgnoreWhiteConfig.java | 32 ++++++ .../com/bwie/gateway/filters/AuthFilter.java | 74 ++++++++++++++ .../com/bwie/gateway/utils/GatewayUtils.java | 98 +++++++++++++++++++ bwie-gateway/src/main/resources/bootstrap.yml | 29 ++++++ .../src/main/resources/bootstrap.yml | 4 +- pom.xml | 1 + 11 files changed, 337 insertions(+), 2 deletions(-) create mode 100644 bwie-gateway/.gitignore create mode 100644 bwie-gateway/pom.xml create mode 100644 bwie-gateway/src/main/java/com/bwie/GateWayApplication.java create mode 100644 bwie-gateway/src/main/java/com/bwie/gateway/config/IgnoreWhiteConfig.java create mode 100644 bwie-gateway/src/main/java/com/bwie/gateway/filters/AuthFilter.java create mode 100644 bwie-gateway/src/main/java/com/bwie/gateway/utils/GatewayUtils.java create mode 100644 bwie-gateway/src/main/resources/bootstrap.yml diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 7fdf451..3a34d3c 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -3,6 +3,7 @@ + diff --git a/bwie-common/src/main/java/com/bwie/common/domain/HealthEducation.java b/bwie-common/src/main/java/com/bwie/common/domain/HealthEducation.java index e9becac..5a72717 100644 --- a/bwie-common/src/main/java/com/bwie/common/domain/HealthEducation.java +++ b/bwie-common/src/main/java/com/bwie/common/domain/HealthEducation.java @@ -22,4 +22,5 @@ public class HealthEducation { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date publishTime; + } diff --git a/bwie-gateway/.gitignore b/bwie-gateway/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/bwie-gateway/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/bwie-gateway/pom.xml b/bwie-gateway/pom.xml new file mode 100644 index 0000000..966d89c --- /dev/null +++ b/bwie-gateway/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + + com.bw + day02 + 1.0-SNAPSHOT + + + bwie-gateway + + + 8 + 8 + UTF-8 + + + + + com.bw + bwie-common + + + + + org.springframework.cloud + spring-cloud-starter-gateway + + + + com.alibaba.cloud + spring-cloud-alibaba-sentinel-gateway + + + + com.alibaba.csp + sentinel-spring-cloud-gateway-adapter + + + \ No newline at end of file diff --git a/bwie-gateway/src/main/java/com/bwie/GateWayApplication.java b/bwie-gateway/src/main/java/com/bwie/GateWayApplication.java new file mode 100644 index 0000000..a5cb511 --- /dev/null +++ b/bwie-gateway/src/main/java/com/bwie/GateWayApplication.java @@ -0,0 +1,19 @@ +package com.bwie; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Author: zhx + * @Package: com.bwie + * @Datetime: 2023/12/10 14:43 + * @Filename: GateWayApplication + */ +@SpringBootApplication +public class GateWayApplication { + public static void main(String[] args) { + + SpringApplication.run(GateWayApplication.class); + + } +} diff --git a/bwie-gateway/src/main/java/com/bwie/gateway/config/IgnoreWhiteConfig.java b/bwie-gateway/src/main/java/com/bwie/gateway/config/IgnoreWhiteConfig.java new file mode 100644 index 0000000..5705d6f --- /dev/null +++ b/bwie-gateway/src/main/java/com/bwie/gateway/config/IgnoreWhiteConfig.java @@ -0,0 +1,32 @@ +package com.bwie.gateway.config; + +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.extern.log4j.Log4j2; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.List; + +/** + * @description: 放行白名单配置 + * @author DongZl + */ +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "ignore") +@Data +@Log4j2 +public class IgnoreWhiteConfig { + /** + * 放行白名单配置,网关不校验此处的白名单 + */ + private List whites = new ArrayList<>(); + + public void setWhites(List whites) { + log.info("加载网关路径白名单:{}", JSONObject.toJSONString(whites)); + this.whites = whites; + } +} diff --git a/bwie-gateway/src/main/java/com/bwie/gateway/filters/AuthFilter.java b/bwie-gateway/src/main/java/com/bwie/gateway/filters/AuthFilter.java new file mode 100644 index 0000000..4b2ebf5 --- /dev/null +++ b/bwie-gateway/src/main/java/com/bwie/gateway/filters/AuthFilter.java @@ -0,0 +1,74 @@ +package com.bwie.gateway.filters; + +import com.bwie.common.constants.JwtConstants; +import com.bwie.common.utils.JwtUtils; +import com.bwie.common.utils.StringUtils; +import com.bwie.gateway.config.IgnoreWhiteConfig; +import com.bwie.gateway.utils.GatewayUtils; + +import io.jsonwebtoken.Claims; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +@Component +public class AuthFilter implements GlobalFilter, Ordered { + + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private IgnoreWhiteConfig ignoreWhiteConfig; + + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + + //获取白名单 + List whites = ignoreWhiteConfig.getWhites(); + + //路径 + ServerHttpRequest request = exchange.getRequest(); + String path = request.getURI().getPath(); + System.out.println("路径>>>>>>"+path); + + //放行 + if (StringUtils.matches(path,whites)){ + return chain.filter(exchange); + } +// +// //获取token +// String token = request.getHeaders().getFirst("token"); +// if(token==null){ +// return GatewayUtils.errorResponse(exchange,"token不存在"); +// } +// +// //token合法性 +// Claims claims = null; +// try { +// claims = JwtUtils.parseToken(token); +// } catch (Exception e) { +// return GatewayUtils.errorResponse(exchange,"token不合法"); +// } +// +// if (!redisTemplate.hasKey(JwtConstants.LOGIN_TOKEN+token)){ +// return GatewayUtils.errorResponse(exchange,"token过期"); +// } +// redisTemplate.expire(JwtConstants.LOGIN_TOKEN+token,10, TimeUnit.MINUTES); + return chain.filter(exchange); + } + + @Override + public int getOrder() { + return 0; + } +} diff --git a/bwie-gateway/src/main/java/com/bwie/gateway/utils/GatewayUtils.java b/bwie-gateway/src/main/java/com/bwie/gateway/utils/GatewayUtils.java new file mode 100644 index 0000000..7b789e5 --- /dev/null +++ b/bwie-gateway/src/main/java/com/bwie/gateway/utils/GatewayUtils.java @@ -0,0 +1,98 @@ +package com.bwie.gateway.utils; + +import com.alibaba.fastjson.JSONObject; +import com.bwie.common.result.Result; +import com.bwie.common.utils.StringUtils; +import lombok.extern.log4j.Log4j2; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * @author DongZl + * @description: 网关处理工具类 + */ +@Log4j2 +public class GatewayUtils { + /** + * 添加请求头参数 + * @param mutate 修改对象 + * @param key 键 + * @param value 值 + */ + public static void addHeader(ServerHttpRequest.Builder mutate, String key, Object value) { + if (StringUtils.isEmpty(key)){ + log.warn("添加请求头参数键不可以为空"); + return; + } + if (value == null) { + log.warn("添加请求头参数:[{}]值为空",key); + return; + } + String valueStr = value.toString(); + mutate.header(key, valueStr); + log.info("添加请求头参数成功 - 键:[{}] , 值:[{}]", key , value); + } + + /** + * 删除请求头参数 + * @param mutate 修改对象 + * @param key 键 + */ + public static void removeHeader(ServerHttpRequest.Builder mutate, String key) { + if (StringUtils.isEmpty(key)){ + log.warn("删除请求头参数键不可以为空"); + return; + } + mutate.headers(httpHeaders -> httpHeaders.remove(key)).build(); + log.info("删除请求头参数 - 键:[{}]",key); + } + + /** + * 错误结果响应 + * @param exchange 响应上下文 + * @param msg 响应消息 + * @return + */ + public static Mono errorResponse(ServerWebExchange exchange, String msg, HttpStatus httpStatus) { + ServerHttpResponse response = exchange.getResponse(); + //设置HTTP响应头状态 + response.setStatusCode(httpStatus); + //设置HTTP响应头文本格式 + response.getHeaders().add(HttpHeaders.CONTENT_TYPE, "application/json"); + //定义响应内容 + Result result = Result.error(msg); + String resultJson = JSONObject.toJSONString(result); + log.error("[鉴权异常处理]请求路径:[{}],异常信息:[{}],响应结果:[{}]", exchange.getRequest().getPath(), msg, resultJson); + DataBuffer dataBuffer = response.bufferFactory().wrap(resultJson.getBytes()); + //进行响应 + return response.writeWith(Mono.just(dataBuffer)); + } + + /** + * 错误结果响应 + * @param exchange 响应上下文 + * @param msg 响应消息 + * @return + */ + public static Mono errorResponse(ServerWebExchange exchange, String msg) { + ServerHttpResponse response = exchange.getResponse(); + //设置HTTP响应头状态 + response.setStatusCode(HttpStatus.OK); + //设置HTTP响应头文本格式 + response.getHeaders().add(HttpHeaders.CONTENT_TYPE, "application/json"); + //定义响应内容 + Result result = Result.error(msg); + String resultJson = JSONObject.toJSONString(result); + log.error("[鉴权异常处理]请求路径:[{}],异常信息:[{}],响应结果:[{}]", exchange.getRequest().getPath(), msg, resultJson); + DataBuffer dataBuffer = response.bufferFactory().wrap(resultJson.getBytes()); + //进行响应 + return response.writeWith(Mono.just(dataBuffer)); + } + + +} diff --git a/bwie-gateway/src/main/resources/bootstrap.yml b/bwie-gateway/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..ebc45b0 --- /dev/null +++ b/bwie-gateway/src/main/resources/bootstrap.yml @@ -0,0 +1,29 @@ +# Tomcat +server: + port: 18080 +# Spring +spring: + application: + # 应用名称 + name: bwie-gateway + profiles: + # 环境配置 + active: dev + main: + # 允许使用循环引用 + allow-circular-references: true + # 允许定义相同的bean对象 去覆盖原有的 + allow-bean-definition-overriding: true + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: 124.223.114.120:8848 + config: + # 配置中心地址 + server-addr: 124.223.114.120:8848 + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} diff --git a/bwie-modules/bwie-blood/src/main/resources/bootstrap.yml b/bwie-modules/bwie-blood/src/main/resources/bootstrap.yml index 7b825cf..697527d 100644 --- a/bwie-modules/bwie-blood/src/main/resources/bootstrap.yml +++ b/bwie-modules/bwie-blood/src/main/resources/bootstrap.yml @@ -1,6 +1,6 @@ # Tomcat server: - port: 9002 + port: 9006 # Spring spring: main: @@ -10,7 +10,7 @@ spring: time-zone: GMT+8 application: # 应用名称 - name: bwie-user + name: bwie-blood profiles: # 环境配置 active: dev diff --git a/pom.xml b/pom.xml index 2e82ea8..34c1a0f 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,7 @@ bwie-common bwie-modules + bwie-gateway