问题现象

GateWat使用OpenFeign调用认证服务,进行授权,认证服务我集成了Shiro

由于是两个项目,他们的session不一致,Shiro的登录用户信息是保存在session中的

所以Shiro即使登录了,用GateWay调用认证服务,也无法获取登录用户信息,就无法进行授权

解决方法

把请求头中的Cookie封装在OpenFeign的请求头中

在GateWay过滤器中把请求头中的Cookie存入redis

1
2
3
4
5
6
7
8
9
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("进入GateWay Shiro过滤器");
// 请求对象
ServerHttpRequest request = exchange.getRequest();
// Cookie放入redis
redisUtil.set("Cookie",request.getHeaders().getFirst("Cookie"));
......
}

OpenFeign请求拦截,把Cookie从redis中取出,放入请求头解决不太服务session不一致的问题

1
2
3
4
5
6
7
8
9
10
@Configuration
public class FeignRequestInterceptor implements RequestInterceptor {
@Autowired
RedisUtil redisUtil;

@Override
public void apply(RequestTemplate requestTemplate) {
requestTemplate.header("Cookie", String.valueOf(redisUtil.get("Cookie")));
}
}

这样,从GateWay进入认证服务,Shiro就能获取到登录用户的信息