SpringCloud 实战:禁止直接访问后端服务

使用 SpringCloud 架构后,我们希望所有的请求都需要经过网关才能访问。在不作任何处理的情况下,我们是可以绕过网关直接访问后端服务的。如下,我们绕过网关直接访问后端服务也是可以获取到数据的。

图片

那我们今天的议题就是如何防止请求绕过网关直接访问后端服务?

图片

解决方案

我觉得防止绕过网关直接请求后端服务的解决方案主要有三种:

  • 使用 Kubernetes 部署

    在使用 Kubernetes 部署 SpringCloud 架构时,我们给网关的 Service 配置 NodePort,其他后端服务的 Service 使用 ClusterIp,这样在集群外就只能访问到网关了。

  • 网络隔离

    后端普通服务都部署在内网,通过防火墙策略限制只允许网关应用访问后端服务。

  • 应用层拦截

    请求后端服务时通过拦截器校验请求是否来自网关,如果不来自网关则提示不允许访问。

这里我们着重关注在应用层拦截这种解决方案。

图片

实现

实现思路

实现思路其实也很简单,在请求经过网关的时候给请求头中增加一个额外的 Header,在后端服务中写一个拦截器,判断请求头是否与在网关设置的请求 Header 一致,如果不一致则不允许访问并给出提示。

当然为了防止在每个后端服务都需要编写这个拦截器,我们可以将其写在一个公共的 starter 中,让后端服务引用即可。而且为了灵活,可以通过配置决定是否只允许后端服务访问。

接下来我们看看核心代码。

实现过程

在网关 cloud-gateway 模块编写网关过滤器

@Component

在请求经过网关时添加额外的 Header,为了方便这里直接设置成固定值。

建立公共 Starter 模块 cloud-component-security-starter

编写配置类,用于灵活控制服务是否允许绕过网关

@Data

编写拦截器,用于校验请求是否经过网关

public class ServerProtectInterceptor implements HandlerInterceptor {

配置拦截器

public class CloudSecurityInterceptorConfigure implements WebMvcConfigurer {

编写 starter 装载类

@EnableConfigurationProperties(CloudSecurityProperties.class)

建立资源文件 spring.factories,配置 Bean 的自动加载

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\`` com.javadaily.component.security.configure.CloudSecurityAutoConfigure

在后端服务配置文件中添加属性配置,默认只能通过网关访问

javadaily:

经过以上几步,一个公共的 Starter 模块就构建完成了。

后端服务引用此公共 Starter 模块即可,以 account-service 为例

<dependency>

实现效果

直接访问后端服务接口
localhost:8010/account/getByCode/ji...

图片

返回结果:

{

以上,希望对你有所帮助!
转载网络

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!