问题现象
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(); 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就能获取到登录用户的信息