一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - SpringCloud Alibaba微服務實戰之隱私接口禁止外部訪問

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

2021-08-02 22:53JAVA日知錄飄渺Jam Java教程

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

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

大家好,我是飄渺!

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

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

業務場景

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

客戶端通過網關調用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. ... 

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

代碼實戰

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

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

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

  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.  

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

測試

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

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

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

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

小結

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩亚洲人成在线综合 | 成全视频在线观看免费 | 爽好舒服快想要免费看 | 丝瓜视频在线观看污 | 四虎影院新网址 | 99久女女精品视频在线观看 | 五月婷婷在线播放 | caoporm碰最新免费公开视频 | 精品国产人成亚洲区 | 国产欧美日韩精品高清二区综合区 | 日韩一级片在线免费观看 | 波多野结衣在线观看视频 | 国产精品全国探花在线观看 | 国产青草视频在线观看免费影院 | 男女男在线精品网站免费观看 | 亚洲国产精品线在线观看 | 日韩视频免费一区二区三区 | 97菊爱网 | 免看一级一片一在线看 | 国产日产韩产麻豆1区 | 美女黄a | 韩国理论三级在线观看视频 | 亚洲精品一二三四 | 特黄一级 | 70岁多老妇人特黄a级毛片 | 亚洲色图欧美视频 | 性美国人xxxxx18 | 亚洲第一天堂无码专区 | 色综合网亚洲精品久久 | 18无删减羞羞网站动漫 | 青草视频免费观看 | 97自拍视频在线观看 | 亚洲第一区二区快射影院 | 亚洲第一免费播放区 | 女人用粗大自熨喷水在线视频 | 精品国产自在在线在线观看 | 午夜在线观看免费观看 视频 | 午夜精品区| 韩剧消失的眼角膜免费完整版 | 性绞姿始动作动态图 | 午夜办公室 |