网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

  作者 | 单一色调 责编 | 张文

  来源 | 转 载自 JAVA 日知录

  前言

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

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

  解决方案

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


  •   使用 Kubernetes 部署

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


  •   网络隔离

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


  •   应用层拦截

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

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

  实现

  实现思路

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

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

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

  实现过程

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

  
@Component@Order(0)public class GatewayRequestFilter implements GlobalFilter {
@Overridepublic Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {byte[] token = Base64Utils.encode((CloudConstant.GATEWAY_TOKEN_VALUE).getBytes());String[] headerValues = {new String(token)};ServerHttpRequest build = exchange.getRequest().mutate().header(CloudConstant.GATEWAY_TOKEN_HEADER, headerValues).build();
ServerWebExchange newExchange = exchange.mutate().request(build).build();return chain.filter(newExchange);}
}

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

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

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

  @Data@ConfigurationProperties(prefix = "javadaily.cloud")public class CloudSecurityProperties {
/*** 是否只能通过网关获取资源* 默认为True*/private Boolean onlyFetchByGateway = Boolean.TRUE;
}

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

  
public class ServerProtectInterceptor implements HandlerInterceptor {
private CloudSecurityProperties properties;
@Overridepublic boolean preHandle(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull Object handler){
if (!properties.getOnlyFetchByGateway()) {return true;}
String token = request.getHeader(CloudConstant.GATEWAY_TOKEN_HEADER);
String gatewayToken = new String(Base64Utils.encode(CloudConstant.GATEWAY_TOKEN_VALUE.getBytes()));
if (StringUtils.equals(gatewayToken, token)) {return true;} else {ResultData resultData = new ResultData<>();resultData.setSuccess(false);resultData.setStatus(HttpServletResponse.SC_FORBIDDEN);resultData.setMessage("请通过网关访问资源");WebUtils.writeJson(response,resultData);return false;}}
public void setProperties(CloudSecurityProperties properties) {this.properties = properties;}}

  配置拦截器

  
public class CloudSecurityInterceptorConfigure implements WebMvcConfigurer {
private CloudSecurityProperties properties;
@Autowiredpublic void setProperties(CloudSecurityProperties properties) {this.properties = properties;}
@Beanpublic HandlerInterceptor serverProtectInterceptor() {ServerProtectInterceptor interceptor = new ServerProtectInterceptor();interceptor.setProperties(properties);return interceptor;}
@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(serverProtectInterceptor());}}

  编写 starter 装载类

  
@EnableConfigurationProperties(CloudSecurityProperties.class)public class CloudSecurityAutoConfigure{
@Beanpublic CloudSecurityInterceptorConfigure cloudSecurityInterceptorConfigure() {return new CloudSecurityInterceptorConfigure();}
}

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

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

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

  
javadaily:cloud:onlyFetchByGateway: true

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

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

  
com.jianzh5.cloudgroupId>cloud-component-security-starterartifactId>dependency>
实现效果

  直接访问后端服务接口
http://localhost:8010/account/getByCode/jianzh5

  返回结果:

  
"message": "请通过网关访问资源","status": 403,"success": false,"timestamp": 1611660015830

  以上,希望对你有所帮助!

  程序员如何避免陷入“内卷”、选择什么技术最有前景,中国开发者现状与技术趋势究竟是什么样?快来参与「2020 中国开发者大调查」,更有丰富奖品送不停!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
新诺基亚N73惊喜满满,谁看了不迷糊!

新诺基亚N73惊喜满满,谁看了不迷糊!

搞机小帝
2025-01-10 00:06:31
相亲富二代死磕前女友?马天宇封杀李明德?李明德诈捐?敖瑞鹏得罪王鹤棣?姨太问答

相亲富二代死磕前女友?马天宇封杀李明德?李明德诈捐?敖瑞鹏得罪王鹤棣?姨太问答

毒舌扒姨太
2025-01-09 22:45:20
泰国为何积极解救王星?有3个目的,最重要是不想放过中国游客!

泰国为何积极解救王星?有3个目的,最重要是不想放过中国游客!

布拉旅游说
2025-01-09 10:16:00
美退役飞行员称欧美媒体判断错误,中方六代机被严重低估了!

美退役飞行员称欧美媒体判断错误,中方六代机被严重低估了!

凯撒谈兵
2025-01-07 20:09:02
范冰冰饭局照流出,喝酒还吐舌头,素颜温婉大方,和妆后判若两人

范冰冰饭局照流出,喝酒还吐舌头,素颜温婉大方,和妆后判若两人

南城无双
2024-10-25 23:54:18
杨紫、李现、肖战、王一博、王俊凯、黄晓明、于适、李宇春等

杨紫、李现、肖战、王一博、王俊凯、黄晓明、于适、李宇春等

祝晓塬
2025-01-09 19:42:07
“奥运奖牌女神”张雨霏,这身材,太扎实了吧!霍家不考虑一下吗

“奥运奖牌女神”张雨霏,这身材,太扎实了吧!霍家不考虑一下吗

木木说星
2025-01-08 20:19:23
案例:14年美女主持陈霞被2名歹徒虐杀,死前乞求:我还想看看儿子

案例:14年美女主持陈霞被2名歹徒虐杀,死前乞求:我还想看看儿子

红豆讲堂
2025-01-02 18:45:03
西安城管查扣摆摊糖葫芦后续,官方账号骂关评,当地至今不敢回应

西安城管查扣摆摊糖葫芦后续,官方账号骂关评,当地至今不敢回应

老鹈爱历史
2025-01-09 17:40:16
银川地震揭示了一个真理:家中一定要有一辆油车!

银川地震揭示了一个真理:家中一定要有一辆油车!

大风文字
2025-01-07 16:18:42
视频曝光!一儿童从雪场缆车坠落,最新通报

视频曝光!一儿童从雪场缆车坠落,最新通报

记者观察
2025-01-09 11:52:40
外网曝鹿晗涉毒被调查,道歉声明网友不信,关晓彤评论区控不住了

外网曝鹿晗涉毒被调查,道歉声明网友不信,关晓彤评论区控不住了

天行舰
2025-01-09 00:00:10
“燕冬萍的微笑”后续,开房记录、怀孕时间、离婚条件引质疑

“燕冬萍的微笑”后续,开房记录、怀孕时间、离婚条件引质疑

南南史
2025-01-09 09:26:40
沉默24小时,特朗普交底,全美将进入紧急状态,中美互通两个电话

沉默24小时,特朗普交底,全美将进入紧急状态,中美互通两个电话

兵哥闲聊
2025-01-09 14:50:37
资本圈 | 碧桂园终于公布境外债方案;万科继续筹集资金;信达香港对融创提出清盘

资本圈 | 碧桂园终于公布境外债方案;万科继续筹集资金;信达香港对融创提出清盘

观点机构
2025-01-10 00:31:04
《我是刑警》原型:公安部九大悬案之一!追凶6年,万人行动!

《我是刑警》原型:公安部九大悬案之一!追凶6年,万人行动!

史记趣闻
2024-12-31 20:10:03
当年明月疯了?可能是佯狂避祸吧。

当年明月疯了?可能是佯狂避祸吧。

人生飞机稿
2025-01-09 20:12:59
53岁闫妮演检察官,演技却遭质疑,网友:全程面无表情太差了

53岁闫妮演检察官,演技却遭质疑,网友:全程面无表情太差了

陈述影视
2025-01-09 23:35:12
向佐换装换发型上热搜,网友夸赞:哥哥一直在突破自我

向佐换装换发型上热搜,网友夸赞:哥哥一直在突破自我

萱小蕾o
2025-01-09 22:16:25
恭喜!郑钦文再签高奢代言 商业价值不输谷爱凌 非奥运年统治商业场

恭喜!郑钦文再签高奢代言 商业价值不输谷爱凌 非奥运年统治商业场

体坛记忆
2025-01-10 00:04:10
2025-01-10 01:24:49
CSDN incentive-icons
CSDN
成就一亿技术人
25210文章数 241942关注度
往期回顾 全部

科技要闻

国产震撼!15万人CES围观"中国代表队"

头条要闻

模特泰缅边境失联 朋友:有人在园区见过他 一起挨了打

头条要闻

模特泰缅边境失联 朋友:有人在园区见过他 一起挨了打

体育要闻

纳什:梅西是足坛乔丹 哈维魔笛丁丁像我

娱乐要闻

李明德疑似诈捐!下一步全网封号

财经要闻

“9块9首付买房,一年房贷3.5万元”

汽车要闻

10万元级无图智驾 悦也PLUS全路况实测

态度原创

房产
艺术
手机
教育
军事航空

房产要闻

政府工作报告曝光!三亚再迎重磅利好!

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

手机要闻

真我 GT7 Pro 手机获 realme UI 6 15.0.0.162 升级

教育要闻

妈妈边切菜边给女儿讲题,突然声音大了起来,你这样解逻辑不通

军事要闻

逃兵太多 乌克兰想动员海外侨民

无障碍浏览 进入关怀版