日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dubbo接口访问控制

發布時間:2025/4/16 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dubbo接口访问控制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

微服務背景下,一個web應用都可能不再service依賴,而是通過RPC調用遠端服務器上的服務。這些服務里,就包括了一些不能輕易暴露的后臺功能接口。暴露出去的dubbo接口注冊到某一個zk上后,該dubbo接口對注冊到該zk上的消費者都是可見的。對公司內部而言,通常不會有人蓄意去調用一些敏感的接口,但也存在人為誤用的可能呀。為此,考慮通過白名單機制來控制dubbo接口的訪問。

現在以許可ip127.0.0.1訪問接口fundRecordTemplateFacade為例演示。

擴展Filter

首先,我們需要實現com.alibaba.dubbo.rpc.Filter接口:

@Activate(group = { Constants.CONSUMER, Constants.PROVIDER }) public class FacadeAccessFilter implements Filter { private FacadeAccessConfig facadeAccessConfig; public FacadeAccessConfig getFacadeAccessConfig() { return facadeAccessConfig; } // 通過setter方式注入白名單配置文件 public void setFacadeAccessConfig(FacadeAccessConfig facadeAccessConfig) { this.facadeAccessConfig = facadeAccessConfig; } @Override public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { Result result = null; // 獲取調用的接口名 String reqFacade = invoker.getInterface().getSimpleName(); try { // 嘗試在白名單配置文件里查找定義的接口,如果找不到則catch住異常、并許可訪問。 Method method; try { method = facadeAccessConfig.getClass().getDeclaredMethod(editMethodName(reqFacade)); } catch (NoSuchMethodException e) { // 無特殊限制,則許可訪問 result = invoker.invoke(invocation); return result; } // 走到這里,說明白名單配置文件配了對該facade的訪問限制 // 獲取remoteAddress:進行訪問的應用,格式ip:port String remoteAddress = RpcContext.getContext().getRemoteAddressString(); // 只取ip String remoteIp = remoteAddress.split(":")[0]; // 獲取licensinedApplications:許可的應用列表 String licensinedApplications = (String) method.invoke(facadeAccessConfig); if (StringUtils.isNotEmpty(licensinedApplications) && StringUtils.isNotEmpty(remoteIp) && licensinedApplications.contains(remoteIp)) { // 權限許可、進行訪問 Help.log_info(getClass(), " remoteAddress" + remoteAddress + "訪問接口" + reqFacade); result = invoker.invoke(invocation); return result; } else { // 權限不許可、退出訪問 Help.log_info(getClass(), " remoteAddress" + remoteAddress + "無權訪問接口" + reqFacade); result = new RpcResult("remoteAddress" + remoteAddress + "無權訪問接口" + reqFacade); return result; } } catch (SecurityException e) { Help.log_error(getClass(), "校驗remoteAddress是否有權限訪問" + reqFacade + "發生異常", e); } catch (IllegalAccessException e) { Help.log_error(getClass(), "校驗remoteAddress是否有權限訪問" + reqFacade + "發生異常", e); } catch (IllegalArgumentException e) { Help.log_error(getClass(), "校驗remoteAddress是否有權限訪問" + reqFacade + "發生異常", e); } catch (InvocationTargetException e) { Help.log_error(getClass(), "校驗remoteAddress是否有權限訪問" + reqFacade + "發生異常", e); } return result; } private String editMethodName(String fieldName) { return "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1, fieldName.length()); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

配置文件

  • 在resources目錄下添加純文本文件META-INF/dubbo/com.alibaba.dubbo.rpc.Filter,內容如下:?

  • 修改配置文件dubbo-common.xml,在dubbo:provider屬性中添加配置的filter,內容如下:?

  • 擴展Filter時,我們是通過setter方法將訪問白名單FacadeAccessConfig注冊到FacadeAccessFilter類中的,那么在配置文件(譬如:applicationContext.xml)里還需要對bean實例化。

  • <!-- 將facade訪問白名單注冊到FacadeAccessFilter類中 --><bean id="facadeAccessFilter" class="com.roger.account.provider.filter.FacadeAccessFilter"> <property name="facadeAccessConfig" ref="facadeAccessConfig" /> </bean> <bean id="facadeAccessConfig" class="com.roger.account.provider.filter.FacadeAccessConfig" />
    • 1
    • 2
    • 3
    • 4
    • 5

    訪問白名單文件

    我們看一下白名單文件的設計格式。本意希望能配置成”接口名=調用接口的應用名”,因為部署應用的ip變化可能性遠高于應用本身的名稱修改。但是在Invoker和Invocation對象中找不到客戶端的應用名,無奈之下,就設計成了”接口名=調用接口的ip”。?

    下面是FacadeAccessConfig類,定義的私有屬性都是需要控制權限的dubbo接口名,getter方法從配置平臺disconf上找到對應配置文件的對應屬性值。

    @Component(value = "facadeAccessConfig") @DisconfFile(filename = "facadeAccessConfig.properties") public class FacadeAccessConfig { // 定義可以訪問fundRecordTemplateFacade的應用 private String fundRecordTemplateFacade; @DisconfFileItem(associateField = "fundRecordTemplateFacade", name = "fundRecordTemplateFacade") public String getFundRecordTemplateFacade() { return fundRecordTemplateFacade; } public void setFundRecordTemplateFacade(String fundRecordTemplateFacade) { this.fundRecordTemplateFacade = fundRecordTemplateFacade; } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    這樣,對于已經配置的一個接口,新增可訪問的應用只需要添加ip。對于一個新配置的接口,只需要在配置文件facadeAccessConfig.properties里添加”接口名=調用接口的應用名”,然后在FacadeAccessConfig類中新增私有屬性即可。

    轉載于:https://www.cnblogs.com/exmyth/p/8654959.html

    總結

    以上是生活随笔為你收集整理的dubbo接口访问控制的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。