Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,负载均衡和限流.
用户直接访问服务,则失去了gateway的意义.
用户不能直接访问服务,必须在gateway层面进行鉴权后在对服务发起请求.实现对用户的鉴权以及接口的限流.并且可以在gateway层面实现对服务的负载均衡.
Gateway实现请求统一转发
实现思路:
所有的请求都需要通过gateway进行转发,所以就需要在gateway层面对用户请求添加一个header,转发到其他服务的时候则可以使用拦截器HandlerInterceptor拦截请求判断header是否存在并且Value是否正确.
Gateway服务端
依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> ???????<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>?配置文件
Filter?
? ? ??
?
实现GlobalFilter接口拦截gateway请求,为请求设置"from"请求头,(自己测试可以硬编码)为保证安全性,value从redis中获取值。
UserService端
依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>3.1.0</version> </dependency>配置文件
自定义拦截器拦截请求
再拦截器中读取gateway中header的"from" 的value值,判断是否与redis中的值一样,如果不一样则表示请求并非通过gateway转发而来,而是用户直接调用service,未进行鉴权。则拒绝该请求。
测试可通过判断硬编码相等判断.
存在的问题
使用Feign在调用其他服服务的时候,是不通过gateway的,所以是缺少from的 header,
所以在进行feign调用的时候需要添加请求头
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。 |