提交 884b4919 authored 作者: 李秋林's avatar 李秋林

添加过滤器配置token登录;配置子项目路由转发

上级 5cb81497
......@@ -12,36 +12,31 @@
<artifactId>wangxiaolu-promotion-gateway</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<name>wangxiaolu-promotion-gateway</name>
<description>wangxiaolu-promotion-gateway</description>
<properties>
<spring-cloud.version>2023.0.1</spring-cloud.version>
<spring-boot.version>2.4.2</spring-boot.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
<nacos.version>0.2.2.RELEASE</nacos.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
<groupId>com.wangxiaolu</groupId>
<artifactId>wangxiaolu-promotion-common</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${nacos.version}</version>
<version>${alibaba-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
......@@ -49,15 +44,187 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.4.2</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- Web 场景启动器) 来为 Web 开发予以支持。spring-boot-starter-web 为我们提供了嵌入的 Servlet 容器以及 SpringMVC 的依赖,并为 Spring MVC 提供了大量自动配置,可以适用于大多数 Web 开发场景。-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk18on -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
</dependency>
<!-- 微信小程序 SDK 依赖 -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- 腾讯云服务 -->
<!-- 请到https://search.maven.org/search?q=tencentcloud-sdk-java查询所有版本,最新版本如下 -->
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java-sms</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.xuxueli/xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.1</version>
<exclusions>
<exclusion>
<artifactId>commons-io</artifactId>
<groupId>commons-io</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- gateway 负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.1.1</version>
</dependency>
</dependencies>
......
......@@ -2,8 +2,10 @@ package com.promotion.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableConfigurationProperties
@EnableDiscoveryClient
@SpringBootApplication
public class WangxiaoluPromotionGatewayApplication {
......
package com.promotion.gateway.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author : liqiulin
* @date : 2024-05-23 13
* @describe :
*/
@RestController
public class ProviderController {
@GetMapping("/helloProvider")
public String helloProvider(){
return "你好,我是提供服务者";
}
}
\ No newline at end of file
package com.promotion.gateway.data;
import com.alibaba.fastjson.JSONObject;
/**
* @author : liqiulin
* @date : 2024-05-23 17
* @describe :
*/
public interface UserDataService {
JSONObject getUserByToken(String token);
}
package com.promotion.gateway.data.impl;
import com.alibaba.fastjson.JSONObject;
import com.promotion.gateway.data.UserDataService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
/**
* @author : liqiulin
* @date : 2024-05-23 16
* @describe : token - user互转
*/
@Slf4j
@Service
public class UserDataServiceImpl implements UserDataService {
@Autowired
RedisTemplate<String, String> redisTemplate;
@Override
public JSONObject getUserByToken(String token) {
ValueOperations<String, String> vo = redisTemplate.opsForValue();
String val = vo.get(token);
return JSONObject.parseObject(val);
}
}
package com.promotion.gateway.filter;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.promotion.gateway.data.UserDataService;
import com.wangxiaolu.promotion.result.basedata.R;
import com.wangxiaolu.promotion.result.basedata.RCode;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.filter.OrderedFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
/**
* @author : liqiulin
* @date : 2024-05-23 16
* @describe : 权限校验过滤器
*/
@Slf4j
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
// 用户注册、用户登录、发送手机号验证码
private final String whiteUrl = "login";
@Autowired
UserDataService userDataService;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 当前访问的url
String url = exchange.getRequest().getURI().getPath();
// 1、判断url是否放行
if (url.contains(whiteUrl)) {
log.info("请求放行,URL:{}", url);
return chain.filter(exchange);
}
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
// 2、未登录请求跳转登录
if (StringUtils.isBlank(token)) {
return loginError(exchange);
}
// 3、验证token'
JSONObject userJson = userDataService.getUserByToken(token);
if (Objects.isNull(userJson)) {
log.info("token登录错误:{}", token);
return loginError(exchange);
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return -1;
}
private Mono<Void> loginError(ServerWebExchange exchange) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.OK);
response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
R res = new R(RCode.NOT_LOGIN_ERROR);
DataBuffer buffer = response.bufferFactory().wrap(new Gson().toJson(res).getBytes(StandardCharsets.UTF_8));
return response.writeWith(Flux.just(buffer));
}
}
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://bj-cdb-j8ppdy86.sql.tencentcdb.com:63569/promotion_dev?autoReconnect=true
username: LnNDBM
password: fd0%bhD4@oO(%
redis:
port: 21101
host: bj-crs-oyzhz3c6.sql.tencentcdb.com
database: 0
password: u)R3jrHk(qwt~mv$Tg=U
main:
web-application-type: reactive
cloud:
nacos:
discovery:
server-addr: 42.193.103.153:8848
namespace: dd681f3c-0d21-42e5-a96e-14863a7cdcdb
group: promotion
cluster-name: wangxiaolu-promotion-gateway
gateway:
discovery:
locator:
enabled: true
routes:
- id: wangxiaolu-promotion-service
uri: lb://wangxiaolu-promotion-service
# uri: http://127.0.0.1:8011
predicates:
- Path=/**
server.port=8010
spring.application.name=wangxiaolu-promotion-gateway
spring.cloud.nacos.discovery.server-addr=42.193.103.153:8848
spring.cloud.nacos.discovery.namespace=dd681f3c-0d21-42e5-a96e-14863a7cdcdb
spring.cloud.nacos.discovery.group=promotion
......@@ -2,17 +2,8 @@ server:
port: 8010
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://bj-cdb-j8ppdy86.sql.tencentcdb.com:63569/promotion_dev?autoReconnect=true
username: LnNDBM
password: fd0%bhD4@oO(%
application:
name: wangxiaolu-promotion-gateway
cloud:
nacos:
discovery:
server-addr: 42.193.103.153:8848
namespace: dd681f3c-0d21-42e5-a96e-14863a7cdcdb
group: promotion
profiles:
active: dev
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论