成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringCloud Alibaba微服務實戰之隱私接口禁止外部訪問

開發 架構
今天我們要反其道而行之,介紹在SpringCloud體系中如何防止內部隱私接口被網關調用。

 [[414726]]

本文轉載自微信公眾號「JAVA日知錄」,作者飄渺Jam。轉載本文請聯系JAVA日知錄公眾號。

大家好,我是飄渺!

在SpringCloud實戰系列文章中曾經介紹過在SpringCloud體系下如何防止前端請求繞過網關直接到達后端微服務,今天我們要反其道而行之,介紹在SpringCloud體系中如何防止內部隱私接口被網關調用。

看到這里可能有的同學會有點暈,怎么還有這種業務場景呢,別急,咱們先回顧一下我們的業務場景。

業務場景

客戶端通過網關調用OrderService服務獲取數據,OrderService通過Feign調用AccountService服務,而當AccountService提供對應的Feign接口后,客戶端是可以通過網關直接調用AccountService接口的。

現在假設AccountService提供的接口包含了部分隱私數據,只允許內部調用協助OrderService進行業務邏輯處理,不允許客戶端直接獲取,此時咱們需要怎么做?

業務實戰

我們先通過代碼將原始的流程實現出來,即通過網關調用OrderService的OrderController,然后在OrderController中通過Feign調用AccountService的AccountController,為了便于閱讀,文章中刪除了部分無用代碼。

模擬實現

入口 OrderController

  1. public class OrderController { 
  2.     private final OrderService orderService; 
  3.     private final AccountClient accountClient; 
  4.  
  5.  
  6.     @GetMapping("/order/{orderNo}"
  7.     public ResultData<OrderDTO> getById(@PathVariable("orderNo") String orderNo){ 
  8.         OrderDTO orderDTO = orderService.selectByNo(orderNo); 
  9.         ResultData<String> secretValue = accountClient.getSecretValue(); 
  10.         log.info(secretValue); 
  11.         return ResultData.success(orderDTO); 
  12.     } 

在OrderController中通過AccountClient調用AccountService

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

Feign接口

  1. public interface AccountApi { 
  2.   ... 
  3.     @GetMapping("/account/getSecretValue"
  4.     ResultData<String> getSecretValue(); 
  5.   ... 

AccountController實現

  1. @RestController 
  2. @Log4j2 
  3. @Api(tags = "account接口"
  4. @RequiredArgsConstructor(onConstructor = @__(@Autowired)) 
  5. public class AccountController implements AccountApi { 
  6.  
  7.     /** 
  8.      * 隱私接口,禁止通過網關訪問 
  9.      */ 
  10.     @Override 
  11.     @GetMapping("/account/getSecretValue"
  12.     public ResultData<String> getSecretValue() { 
  13.         return ResultData.success("隱私接口,禁止通過網關訪問"); 
  14.     } 
  15.      

正如我們前面所說,一旦提供了Feign接口,在默認情況下我們可以直接通過網關訪問getSecretValue()方法,那怎么確保這個方法不讓外部調用呢?

解決方案

網上現在大部分的解決辦法是基于黑名單機制,即將這些接口放入“黑名單”中存儲起來,在網關啟動時讀取黑名單配置,然后校驗是否在黑名單中。

這種辦法確實也可以,但是總感覺不夠靈活,而且實現也比較繁瑣,這里就不展開了。

我們今天介紹的是利用訪問路徑來實現,非常簡單輕便。

實現原理

我們需要借助接口路徑規范來實現,即給接口指定訪問路徑時采用這樣的格式 : /訪問控制/接口。

訪問控制可以有以下幾個規則(參考JAVA包規范),可根據業務需要進行擴展。

  1. pb - public 所有請求均可訪問 
  2.  
  3. pt - protected 需要進行token認證通過后方可訪問 
  4.  
  5. pv - private 無法通過網關訪問,只能微服務內部調用 
  6.  
  7. df - default 網關請求token認證,并且請求參數和返回結果進行加解密 
  8.  
  9. ... 

有了這套接口規范以后,我們就可以靈活控制接口訪問權限,然后在網關對接口路徑進行校驗,如果命中對應的訪問控制規則就進行對應的邏輯處理。

代碼實戰

既然知道了實現原理,那寫代碼就很簡單了。

修改接口訪問路徑,遵循接口路徑規范

  1. public interface AccountApi { 
  2.     @GetMapping("/pv/account/getSecretValue"
  3.     ResultData<String> getSecretValue(); 

修改feign的訪問路徑。

  1. @RestController 
  2. @Log4j2 
  3. @Api(tags = "account接口"
  4. @RequiredArgsConstructor(onConstructor = @__(@Autowired)) 
  5. public class AccountController implements AccountApi { 
  6.  
  7.     /** 
  8.      * 隱私接口,禁止通過網關訪問 
  9.      */ 
  10.     @Override 
  11.     @GetMapping("/pv/account/getSecretValue"
  12.     public ResultData<String> getSecretValue() { 
  13.         return ResultData.success("隱私接口,禁止通過網關訪問"); 
  14.     } 
  15.      

修改接口實現類的訪問路徑,這里需要與Feign的路徑保持一致。

網關自定義攔截器進行接口校驗

  1. @Component 
  2. @Order(0) 
  3. @Slf4j 
  4. public class GatewayRequestFilter implements GlobalFilter { 
  5.  
  6.     @Override 
  7.     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { 
  8.         //獲取請求路徑 
  9.         String rawPath = exchange.getRequest().getURI().getRawPath(); 
  10.  
  11.         if(isPv(rawPath)){ 
  12.             throw new HttpServerErrorException(HttpStatus.FORBIDDEN,"can't access private API"); 
  13.         } 
  14.         return chain.filter(newExchange); 
  15.     } 
  16.  
  17.     /** 
  18.      * 判斷是否內部私有方法 
  19.      * @param requestURI 請求路徑 
  20.      * @return boolean 
  21.      */ 
  22.     private boolean isPv(String requestURI) { 
  23.         return isAccess(requestURI,"/pv"); 
  24.     } 
  25.  
  26.     /** 
  27.      * 網關訪問控制校驗 
  28.      */ 
  29.     private boolean isAccess(String requestURI, String access) { 
  30.         //后端標準請求路徑為 /訪問控制/請求路徑 
  31.         int index = requestURI.indexOf(access); 
  32.         return index >= 0 && StringUtils.countOccurrencesOf(requestURI.substring(0,index),"/") < 1; 
  33.     } 
  34.  

通過上面簡單兩步我們就能實現本文提出的問題了,接下來我們測試一下。

測試

直接訪問后端服務,提示無法訪問。

通過OrderService訪問后端服務正常訪問。

小結

讓內部隱私接口不被外部訪問,我相信做微服務開發的同學基本都會遇到。本文中提供的解決方案代碼量很少而且接口路徑規范可以根據自己的業務規則進行修改擴展,推薦大家使用。其實代碼不是關鍵,關鍵在于要讓團隊共同遵守這個接口規范,思想比實現更重要。

 

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2021-01-28 10:10:51

微服務后端SpringCloud

2021-05-14 09:15:32

SpringCloud微服務日志

2021-03-09 09:33:42

網關授權微服務

2021-04-22 09:31:58

服務器微服務配置

2021-06-09 09:42:50

SpringCloud微服務灰度發布

2022-04-09 14:45:02

微服務常見概念Spring

2021-03-26 06:01:45

日志MongoDB存儲

2016-08-25 21:12:31

微服務架構發布

2016-08-25 20:55:19

微服務架構發布

2022-04-27 08:23:34

微服務負載均衡

2021-02-04 09:18:20

服務器認證自定義

2025-03-13 00:55:00

微服務架構系統

2023-02-07 07:43:27

微服務應用框架

2017-09-05 14:05:11

微服務spring clou路由

2025-04-17 02:00:00

2024-03-06 08:36:36

2025-03-07 08:57:46

HTTP客戶端框架

2021-05-31 11:22:24

微服務開發框架

2022-05-29 21:38:11

限流熔斷流量

2022-06-24 07:08:24

OHOS自定義服務
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99热激情 | 国产精品久久av | 久久网一区二区 | 日韩免费 | 91天堂网 | 成人性视频免费网站 | 在线欧美一区 | 台湾a级理论片在线观看 | 欧美视频在线播放 | 欧美a视频 | 操操日 | 欧美中文字幕一区二区三区亚洲 | 99精品视频网| 一区二区三区四区在线 | 天天亚洲| 国户精品久久久久久久久久久不卡 | 日韩在线免费视频 | 亚洲综合视频 | 国产亚洲网站 | 成人免费视频播放 | 欧美性受xxxx白人性爽 | 成人在线播放 | 日韩av啪啪网站大全免费观看 | 国产在线成人 | 性欧美精品一区二区三区在线播放 | 欧美a在线| 午夜网| 久久最新 | 亚洲精品九九 | 亚洲综合在线网 | 日本精品久久久久久久 | 久久久精品网 | 久久国产婷婷国产香蕉 | 欧美亚洲国产一区二区三区 | 精品国产乱码久久久久久蜜柚 | 日韩久久久久久久久久久 | 色天堂视频| 少妇一级淫片aaaaaaaaa | 91精品国产综合久久精品 | 国产精品99久久久久久宅男 | 国产粉嫩尤物极品99综合精品 |