国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品第一区在线观看 | 亚洲成人精品在线观看 | 国产精品久久久久久吹潮 | 天天天天干 | 欧美91看片特黄aaaa | 成人高清网站 | 国产欧美综合一区二区三区 | 免费久久精品 | 97超碰在线播放 | 伊人久久国产 | 伊人春色网 | 中文字幕久久网 | 免费成人黄色 | 久久一区二区视频 | 久久国产电影 | 日韩小视频 | 中文字幕久久久 | 超碰综合 | 日韩av电影在线免费观看 | 九九热这里都是精品 | 精品国产乱码久久久久久牛牛 | 成人在线一区二区 | 亚洲精品三级 | 日本女人高潮视频 | 性色av一区二区三区红粉影视 | 色狠狠综合天天综合综合 | 久久99国产精品久久99大师 | 久久久精品黄色 | 欧美精品成人一区二区三区四区 | 久久久久久久av | 日韩精品视频在线 | av成人免费 | 亚洲免费视频在线观看 | 久久99精品久久久久久久青青日本 | 国产免费一区二区三区 | 亚洲欧美日韩在线 | 日日日日干干干干 | 五月激情综合网 | 激情综合在线 | 国产精品精品视频一区二区三区 | а√天堂中文在线资源8 |