SpringCloud Alibaba微服务实战之隐私接口禁止外部访问

2025-05-29 0 81

SpringCloud Alibaba微服务实战之隐私接口禁止外部访问

大家好,我是飘渺!

SpringCloud实战系列文章中曾经介绍过在SpringCloud体系下如何防止前端请求绕过网关直接到达后端微服务,今天我们要反其道而行之,介绍在SpringCloud体系中如何防止内部隐私接口被网关调用。

看到这里可能有的同学会有点晕,怎么还有这种业务场景呢,别急,咱们先回顾一下我们的业务场景。

业务场景

SpringCloud Alibaba微服务实战之隐私接口禁止外部访问

客户端通过网关调用OrderService服务获取数据,OrderService通过Feign调用AccountService服务,而当AccountService提供对应的Feign接口后,客户端是可以通过网关直接调用AccountService接口的。

现在假设AccountService提供的接口包含了部分隐私数据,只允许内部调用协助OrderService进行业务逻辑处理,不允许客户端直接获取,此时咱们需要怎么做?

业务实战

我们先通过代码将原始的流程实现出来,即通过网关调用OrderService的OrderController,然后在OrderController中通过Feign调用AccountService的AccountController,为了便于阅读,文章中删除了部分无用代码。

模拟实现

入口 OrderController

  1. publicclassOrderController{
  2. privatefinalOrderServiceorderService;
  3. privatefinalAccountClientaccountClient;
  4. @GetMapping("/order/{orderNo}")
  5. publicResultData<OrderDTO>getById(@PathVariable("orderNo")StringorderNo){
  6. OrderDTOorderDTO=orderService.selectByNo(orderNo);
  7. ResultData<String>secretValue=accountClient.getSecretValue();
  8. log.info(secretValue);
  9. returnResultData.success(orderDTO);
  10. }
  11. }

在OrderController中通过AccountClient调用AccountService

  1. ResultData<String>secretValue=accountClient.getSecretValue();

Feign接口

  1. publicinterfaceAccountApi{
  2. @GetMapping("/account/getSecretValue")
  3. ResultData<String>getSecretValue();
  4. }

AccountController实现

  1. @RestController
  2. @Log4j2
  3. @Api(tags="account接口")
  4. @RequiredArgsConstructor(onConstructor=@__(@Autowired))
  5. publicclassAccountControllerimplementsAccountApi{
  6. /**
  7. *隐私接口,禁止通过网关访问
  8. */
  9. @Override
  10. @GetMapping("/account/getSecretValue")
  11. publicResultData<String>getSecretValue(){
  12. returnResultData.success("隐私接口,禁止通过网关访问");
  13. }
  14. }

正如我们前面所说,一旦提供了Feign接口,在默认情况下我们可以直接通过网关访问getSecretValue()方法,那怎么确保这个方法不让外部调用呢?

解决方案

网上现在大部分的解决办法是基于黑名单机制,即将这些接口放入“黑名单”中存储起来,在网关启动时读取黑名单配置,然后校验是否在黑名单中。

这种办法确实也可以,但是总感觉不够灵活,而且实现也比较繁琐,这里就不展开了。

我们今天介绍的是利用访问路径来实现,非常简单轻便。

实现原理

我们需要借助接口路径规范来实现,即给接口指定访问路径时采用这样的格式 : /访问控制/接口。

访问控制可以有以下几个规则(参考JAVA包规范),可根据业务需要进行扩展。

  1. pb-public所有请求均可访问
  2. pt-protected需要进行token认证通过后方可访问
  3. pv-private无法通过网关访问,只能微服务内部调用
  4. df-default网关请求token认证,并且请求参数和返回结果进行加解密

有了这套接口规范以后,我们就可以灵活控制接口访问权限,然后在网关对接口路径进行校验,如果命中对应的访问控制规则就进行对应的逻辑处理。

代码实战

既然知道了实现原理,那写代码就很简单了。

SpringCloud Alibaba微服务实战之隐私接口禁止外部访问

修改接口访问路径,遵循接口路径规范

  1. publicinterfaceAccountApi{
  2. @GetMapping("/pv/account/getSecretValue")
  3. ResultData<String>getSecretValue();
  4. }

修改feign的访问路径。

  1. @RestController
  2. @Log4j2
  3. @Api(tags="account接口")
  4. @RequiredArgsConstructor(onConstructor=@__(@Autowired))
  5. publicclassAccountControllerimplementsAccountApi{
  6. /**
  7. *隐私接口,禁止通过网关访问
  8. */
  9. @Override
  10. @GetMapping("/pv/account/getSecretValue")
  11. publicResultData<String>getSecretValue(){
  12. returnResultData.success("隐私接口,禁止通过网关访问");
  13. }
  14. }

修改接口实现类的访问路径,这里需要与Feign的路径保持一致。

网关自定义拦截器进行接口校验

  1. @Component
  2. @Order(0)
  3. @Slf4j
  4. publicclassGatewayRequestFilterimplementsGlobalFilter{
  5. @Override
  6. publicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){
  7. //获取请求路径
  8. StringrawPath=exchange.getRequest().getURI().getRawPath();
  9. if(isPv(rawPath)){
  10. thrownewHttpServerErrorException(HttpStatus.FORBIDDEN,"can'taccessprivateAPI");
  11. }
  12. returnchain.filter(newExchange);
  13. }
  14. /**
  15. *判断是否内部私有方法
  16. *@paramrequestURI请求路径
  17. *@returnboolean
  18. */
  19. privatebooleanisPv(StringrequestURI){
  20. returnisAccess(requestURI,"/pv");
  21. }
  22. /**
  23. *网关访问控制校验
  24. */
  25. privatebooleanisAccess(StringrequestURI,Stringaccess){
  26. //后端标准请求路径为/访问控制/请求路径
  27. intindex=requestURI.indexOf(access);
  28. returnindex>=0&&StringUtils.countOccurrencesOf(requestURI.substring(0,index),"/")<1;
  29. }
  30. }

通过上面简单两步我们就能实现本文提出的问题了,接下来我们测试一下。

测试

直接访问后端服务,提示无法访问。

SpringCloud Alibaba微服务实战之隐私接口禁止外部访问

通过OrderService访问后端服务正常访问。

SpringCloud Alibaba微服务实战之隐私接口禁止外部访问

小结

让内部隐私接口不被外部访问,我相信做微服务开发的同学基本都会遇到。本文中提供的解决方案代码量很少而且接口路径规范可以根据自己的业务规则进行修改扩展,推荐大家使用。其实代码不是关键,关键在于要让团队共同遵守这个接口规范,思想比实现更重要。

原文链接:https://mp.weixin.qq.com/s/cF7BnmZ2QPAfwpP8qGRbmQ

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 SpringCloud Alibaba微服务实战之隐私接口禁止外部访问 https://www.kuaiidc.com/109174.html

相关文章

发表评论
暂无评论