关于spring cloud gateway 的routes的方式使用本文不再涉及,可以百度查到很多资料,这里主要说spring cloud gateway网关服务内部的接口鉴权方式

 

由于很多原因,不得不将一些访问量很低,性能优异的接口写在网关内部,这其实是不好的做法,但是有的时候相比其他做法却又是最佳的,此时我们会面临一个问题,那就是这些接口如何鉴权的问题,这里比较麻烦,可能多数小伙伴对webflux 了解不多,我也是,因此花了很多时间,走了很多冤枉路,最后感谢大佬的帮助才得以了解这个关键字以此来解决了问题!

 

首先我们熟悉的spring cloud gateway内置的GlobalFilter不再好用,因为它是针对routes来进行转发的,具体不再过多叙述,而我们熟悉的springboot的拦截器以及过滤器一样不好用,因为我们接触的springboot项目大多不是基于webflux实现的。

 

因此我们要用webflux的过滤器来实现这个功能。说到这里相信你们以及get到关键字了,下面直接上代码。

 

/**
 * @ClassName LoginLocalFilter
 * @Description //网关内接口鉴权
 * @Author TY
 * @Date 2020/12/16 17:07
 * @Version 1.0
 **/
@Log4j2
@Order(-1)
@Component
public class LoginLocalFilter implements WebFilter {
    private final UserService userService;

    @Autowired
    public LoginLocalFilter(UserService userService) {
        this.userService = userService;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();

        //TODO It`s your time

        /*过滤器链的概念都是类似的,调用过滤器链的filter方法将请求转到下一个filter,如果该filter是最后一  个filter,那就转到
        该请求对应的handler,也就是controller方法或函数式endpoint */
        return chain.filter(exchange);
    }
}

 

 

这里解释一下有些接口写在网关里相比写在其他服务中却是更好的,可能有些小伙伴没有遇到过,比如你想通过网关这个入口来调用所有服务的共同接口最后将数据汇总,结合网关的配置文件(和路由转发有一定关系)进行加工呈现,这种做法放在其他业务服务内并不好,因此不得已产生了本文的需求。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐