irpas技术客

gateway确保服务只能通过gateway转发,禁止直接调用接口访问_如果不丑还是挺帅的吧_gateway 转发

网络投稿 2645

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.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #gateway #转发 #Spring #Cloud #Filter