【业务开发】接口不能对外暴露怎么办?

news/2025/1/22 15:40:22/文章来源:https://www.cnblogs.com/o-O-oO/p/18684861

在业务开发中,当某些接口不能对外暴露时,需要采取一系列措施来保护这些接口的安全性和隐私性。
以下是对该问题的详解及案例分析:

一、接口不能对外暴露的原因

1、安全性考虑
某些接口可能包含敏感信息或者涉及到系统的核心功能,因此需要限制对其访问,以确保系统的安全性。
2、商业考虑
有些接口可能包含了公司的商业机密或者核心竞争力,因此需要限制对其访问,以防止被竞争对手获取关键信息。
3、合规要求
根据某些行业标准或者法律法规的要求,某些接口可能需要进行严格的权限管理和监控,以确保符合相关的合规要求。

二、解决方案

2.1 内外网接口微服务隔离

【方案描述】:
将对外暴露的接口和对内暴露的接口分别放到两个微服务上,一个服务里所有的接口均对外暴露,另一个服务的接口只能内网服务间调用。

【案例分析】:
假设有一个电商平台,其用户注册和登录接口需要对外暴露,而订单处理接口只能由内部服务调用。此时,可以将用户注册和登录接口放在一个微服务中,而将订单处理接口放在另一个微服务中。通过微服务隔离,可以确保订单处理接口不会被外部用户直接访问。
【优点】:

实现上比较简单,不用额外做复杂的权限校验;易于管理,只需要控制服务的暴露范围。
【缺点】:

新增内网微服务会让整体架构复杂度上升,维护成本变高。此外,服务数量增多可能会导致调用链变长,影响性能。

示例:

使用 Spring Cloud Gateway 限制外部访问 spring:

  cloud:gateway:routes:- id: internal_serviceuri: http://internal-service:8080predicates:- Path=/internal/**  # 只允许访问 `/internal/**` 路径filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10redis-rate-limiter.burstCapacity: 20metadata:security: internal  # 用于标识此接口仅限内网访问

原理:

API 网关 可以通过 IP 白名单或基于请求头等方式来对接口进行访问控制。通过配置可以确保只有从内网服务发出的请求能访问这些接口。

2.2 网关+Redis实现白名单机制

【方案描述】:
在Redis中维护一套接口白名单列表,外部请求到达网关时,从Redis获取接口白名单,在白名单内的接口放行,反之拒绝掉。

【案例分析】:
假设有一个企业内部管理系统,其中部分接口需要对外开放,而大部分接口只能由内部员工访问。此时,可以在Redis中维护一个接口白名单,将需要对外开放的接口添加到白名单中。网关拦截所有外部请求,并根据白名单判断请求是否合法。

【优点】:

对业务代码零侵入性,不需要在业务代码上修改;可以灵活调整白名单,动态增加或减少接口。
【缺点】:
白名单维护成本较高,尤其是当接口数量庞大、频繁变动时;每次请求都要查Redis,增加了系统响应耗时,对性能有一定影响。

示例:

基于 IP 白名单限制接口访问

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@EnableWebSecurity
publicclass SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotectedvoidconfigure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/internal/**").hasIpAddress("192.168.0.0/16")  // 允许内网 IP 访问.anyRequest().authenticated()  // 其他请求需要身份验证.and().httpBasic();  // 启用基础 HTTP 验证(可根据需求修改)}
}

原理:

使用 Spring Security 配合 IP 地址检查,可以对指定路径(如 /internal/**)限制为特定 IP 地址范围(如内网 IP)。只有匹配的 IP 地址能够访问这些接口。

2.3 网关+AOP在业务侧判断访问权限

【方案描述】:
通过网关对所有经过的请求的header里添加一个字段来区分请求来源,业务侧接口收到请求后判断header里的字段,根据该接口是否属于内部接口来决定是否放行该请求。

【案例分析】:
假设有一个金融系统,其中部分接口需要对外开放以提供API服务,而大部分接口涉及敏感数据只能由内部服务调用。此时,可以在网关侧对所有经过的请求添加一个标识字段(如from=public),业务侧接口通过AOP切面检查该字段,如果请求来自外部且访问的是内部接口,则拒绝访问。

【优点】:
将内外网访问权限的处理分布到各个业务侧进行,消除了由网关来处理的系统性瓶颈;开发者可以在业务侧直接确定接口的内外网访问权限,提升开发效率的同时增加了代码的可读性。
【缺点】:
对业务代码有一定的侵入性,不过可以通过注解等形式最大限度地降低这种侵入性。

示例:自定义注解 + AOP 访问控制:

1、定义注解:首先定义一个注解,表示某些接口是内网接口。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InternalOnly {
}

2、实现 AOP 切面

然后创建一个 AOP 切面,检查请求的源 IP,只有内网请求可以访问被 @InternalOnly 注解标记的方法。

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;@Aspect
@Component
publicclass AccessControlAspect {privatefinal HttpServletRequest request;publicAccessControlAspect(HttpServletRequest request) {this.request = request;}@Pointcut("@annotation(com.example.InternalOnly)")publicvoidinternalOnlyMethods() {}@Before("internalOnlyMethods()")publicvoidcheckIp() {String clientIp = request.getRemoteAddr();if (!clientIp.startsWith("192.168")) {  // 只允许内网 IPthrownew AccessDeniedException("Access denied for external requests.");}}
}

3、应用注解:

@RestController
public class InternalController {@InternalOnly@GetMapping("/internal/data")public String getInternalData() {return "Internal Data";}
}

原理:

通过自定义注解标记内网接口,然后通过 AOP 在方法调用前检查请求的源 IP 是否符合内网访问的要求。若不符合,则抛出 AccessDeniedException。

三、综合建议

在实际应用中,可以根据业务需求和系统架构选择合适的解决方案。同时,还可以结合多种方案来增强系统的安全性和稳定性。例如,可以同时使用内外网接口微服务隔离和网关+AOP判断访问权限的方案,以确保敏感接口的安全性和隐私性。

此外,还可以采取其他安全措施来增强系统的防护能力,如使用HTTPS协议确保数据在传输过程中的安全性、对敏感数据进行加密存储、记录所有接口的访问日志并定期分析日志以发现潜在的安全问题等。

综上所述,当业务开发中接口不能对外暴露时,需要综合考虑安全性、商业保密和合规需求等因素,选择合适的解决方案来确保系统的安全性和稳定性。

原创 womubuji

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/873278.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OM6621F低功耗低成本蓝牙芯片支持BLE5.1和2.4G私有协议集成了电源管理单元(PMU)BMS电池管理领域首选方案

OM6621Fx是一款专为蓝牙低功耗和专有2.4GHz应用设计的功率优化的真系统级芯片(SOC)解决方案。它集成了高性能和低功率的射频收发器,具有蓝牙基带和丰富的外围I0扩展。OM6621Fx还集成了电源管理单元(PMU),以实现高效率的电源管理。它针对2.4GHz蓝牙低功耗系统、专有2.4GHz系统…

Jetpack架构组件学习(6)——使用Glance实现桌面小组件

原文地址: Jetpack架构组件学习(6)——使用Glance实现桌面小组件-Stars-One的杂货小窝公司陆续整了几个Compose写的app,有个小组件的功能,顺便试了下Jetpack库里的Glance框架 感觉与原来的Remoteview差点意思,不过点击事件的使用比Remoteview要方便不少PS: 如果想看Remoteview实…

《操作系统真象还原》第九章 线程(二) 多线程轮转调度

本文是对《操作系统真象还原》第九章(二)学习的笔记,欢迎大家一起交流第九章 线程(二) 多线程轮转调度 本文是对《操作系统真象还原》第九章(二)学习的笔记,欢迎大家一起交流,目前所有代码已托管至 fdx-xdf/MyTinyOS 。 上一节中成功创建了线程并运行,这一节要实现的…

Cisco APIC 6.0(8e)M - 应用策略基础设施控制器

Cisco APIC 6.0(8e)M - 应用策略基础设施控制器Cisco APIC 6.0(8e)M - 应用策略基础设施控制器 Application Policy Infrastructure Controller (APIC) 请访问原文链接:https://sysin.org/blog/cisco-apic-6/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org思科…

clickhouse本地表和分布式表说明(3分片单副本)

环境: clickhouse:24.8.11.51.创建本地表和分布式表 在一个节点上执行即可,我这里配置的分片使用了 defaultclickhouse-client --host 192.168.1.102 --port=9000 use db_test CREATE TABLE tb_test_local ON CLUSTER default (id Int32,name String,timestamp DateTime DEFAUL…

分发测试

协程的IO asyncio 作为实现异步编程的库,任务执行中遇到系统IO的时能够自动切换到其他任务。协程的IO asyncio 作为实现异步编程的库,任务执行中遇到系统IO的时能够自动切换到其他任务。协程使用的IO模型是IO多路复用。在 asyncio 低阶API 一篇中提到过 “以Linux系统为例,I…

【图】数场功能架构图

【图】数场功能架构图(来源:国家数据基础设施建设指引) (1)点:参与方之间的自身数据安全能力约定; (2)线:涉及到网络高可用,可以根据DSMM评估域进行统一约定; (3)面:DSMM中数据生存周期安全,场景化能力约定;

hyperledger

https://topgoer.cn/docs/blockchain_guide/blockchain_guide-1emut2dv80st1Hyperledger 所有项目代码托管在 Github上。目前,主要包括如下顶级项目(按时间顺序)。Fabric:包括 Fabric、Fabric CA、Fabric SDK(包括 Node.Js、Java、Python 和 Go 语言)等,目标是区块链的基…

【图】数联网功能架构图

【图】数联网功能架构图(来源:国家数据基础设施建设指引)

米尔瑞芯微第二代8nm高性能AIOT平台-RK3576开发板怎么样?

文章来源公众号:电子开发学习 瑞芯微近期推出了第二代8nm高性能AIOT平台——RK3576。 RK3576应用方向指向工业控制及网关,云终端,人脸识别设备,车载中控,商显等等。参数方面,内置了四核Cortex-A72+四核Cortex-A53,频率最高2.2GHz,内置ARM G52 MC3 GPU,NPU算力高达6TO…

openssl头文件出现DEPRECATEDIN_1_1_0导致引入头文件时程序无法编译

openssl头文件出现DEPRECATEDIN_1_1_0导致引入头文件时程序无法编译我使用的是unbuntu20.04版本中,通过apt安装的openssl,发现openssl中的多个库文件中会出现类似DEPRECATEDIN_1_1_0(unsigned char *ASN1_STRING_data(ASN1_STRING *x)),导致引入头文件时无法编译成功. 例如bio.…

人工智能创新型教师培育计划(第一期)

Skip to contentOpenHydraSearchKMain Navigation首页 课程新一代人工智能经典实验【中学】 XEdu系列【中学】 中小学AI开源课程倡议使用指南活动获取支持On this page人工智能创新型教师培育计划(第一期) 一、组织单位 二、活动背景 三、活动内容 四、活动安排 五、师资介绍…