背景
通过用户的一些基本信息生成Token(第三方Team提供此service),在向GateWay发送请求之前会使用RestTemplate请求第三方Token接口获取JWT格式Token,在Header中添加此Token.
然后在请求gateway之后,转发之前,向自己Cloud 中的Auth Service发起请求验证请求,解析Token.判断用户是否存在权限访问Api.
直接上GateWay,Auth Service 只需解析JWT Token,返回用户所拥有的Group,根据Group来确定用户拥有那些服务的操作权限。
GateWay
所需依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
实现GlobalFilter调用AuthService实现鉴权
接口实现GlobalFilter
拦截请求,获取到Header中的Token,Order优先级
@Component
@Order(0)
public class TokenHeaderFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
try {
HttpHeaders headers = exchange.getRequest().getHeaders();
String Token = headers.getFirst("Token");
//随便写一句,勿用!就是根据Token去获取用户所拥有的权限即可
//ResponseDetail
//responseDetail=restTemplate.postForObject(authServiceurl,token);
//自定义response类成功则放过请求
if(responseDetail.success){
//把新的 exchange放回到过滤链
return chain.filter(exchange);
};
} catch (Exception e) {
//抛出自定义异常
throw new GateWayException(".....");
}
}
yaml配置实现路由
spring:
cloud:
gateway:
routes:
- id: service01 #路由ID,一般是其他微服务名称
uri: http://service01url:8080 #匹配后提供服务的路由地址
predicates:
- Path=/service01/** #断言,路径相匹配的进行路由
- id: service02
uri: http://service02url:8080
predicates:
- Path=/service02/**
此上为自己简单路由配置。