首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Web 服務安全實戰:WS-SecurityPolicy 細粒度控制與 Axis2/Rampart 實現

     編輯:Java 相關知識

單層服務架構下 SSL 足矣,但現代 SOA/服務編排常涉多層服務鏈,需更強大的 WS-Security。然而 WS-Security 帶來巨大性能開銷。解決之道:針對各操作/訊息施以恰當策略,而非整個服務套用單一策略。本文演示如何在 WSDL 中內嵌 WS-SecurityPolicy 實現操作級、訊息級細粒度安全控制,並以 Axis2/Rampart 為例說明客戶端與服務端配置。

案例場景:圖書館服務三操作差異化安全需求

  • getBook:公開查詢,**無安全性**。
  • getBooksByType:需授權,**UsernameToken** 驗證。
  • addBook:需審計追蹤,**簽名**請求訊息 (非回應)。

WSDL 內嵌細粒度策略

WS-Policy/WS-SecurityPolicy 設計支援將策略內嵌 WSDL,通過 wsu:Id 標識,在 <wsdl:binding>、<wsdl:operation>、<wsdl:message> 通過 <wsp:PolicyReference URI="#Id"/> 引用。

清單 1 關鍵片段:

<wsp:Policy wsu:Id="SignOnly"> ... <sp:AsymmetricBinding>...<sp:SignedParts><sp:Body/></...> </wsp:Policy>
<wsp:Policy wsu:Id="UsernameToken"> ... <sp:SupportingTokens><sp:UsernameToken/></...> </wsp:Policy>

<wsdl:binding name="LibrarySoapBinding" type="wns:Library">
  <wsdl:operation name="getBook"> ... </wsdl:operation>  <!-- 無策略引用 -->
  <wsdl:operation name="getBooksByType">
    <wsp:PolicyReference URI="#UsernameToken"/>  <!-- 操作級引用 -->
    ...
  </wsdl:operation>
  <wsdl:operation name="addBook">
    <wsdl:input name="addBookRequest">
      <wsp:PolicyReference URI="#SignOnly"/>  <!-- 訊息級引用 (僅輸入) -->
    </wsdl:input>
    ...
  </wsdl:operation>
</wsdl:binding>

策略與 Rampart 配置分離:WSDL 僅含安全意圖,Rampart 具體配置 (Keystore、CallbackHandler 等) 另存獨立策略文件,客戶端/服務端分別應用。

客戶端配置與調用

  1. 從帶策略 WSDL 生成存根 (代碼介面不變)。
  2. 在 ServiceClient 應用 Rampart 配置策略並啟用模組:
    LibraryGranularStub stub = new LibraryGranularStub(target);
    ServiceClient client = stub._getServiceClient();
    client.getAxisService().applyPolicy(loadPolicy("rampart-client-policy.xml"));
    client.engageModule("rampart");
    Options opts = client.getOptions();
    opts.setUserName("libuser");
    opts.setPassword("books");
    
  3. 用戶名密雖全局設置,但 Rampart 僅在需 UsernameToken 操作時使用,無副作用。

Rampart 客戶端配置策略包含簽名用 Keystore、密碼回調類等。

服務端配置:operations 級別應用 Rampart

將 Rampart 配置策略合併至 services.xml 對應操作定義中 (而非整個服務)。使用 PolicyTool 程序自動合併。

合併後 services.xml 關鍵結構:

<service name="library-granular">
  <operation name="getBook"> ... </operation>  <!-- 無 Rampart -->
  <operation name="getBooksByType">
    <module ref="rampart"/>
    <wsp:Policy> ... Rampart 配置 ... </wsp:Policy>
  </operation>
  <operation name="addBook">
    <module ref="rampart"/>
    <wsp:Policy> ... Rampart 配置 ... </wsp:Policy>
  </operation>
</service>

部署 AAR 後,管理控制台可見僅兩操作掛載 Rampart 模組。運行驗證:

  • getBook:無 WS-Security Header。
  • getBooksByType:請求含 UsernameToken Header。
  • addBook:請求 (非回應) 含簽名 Header。

Axis2/Rampart 現存限制

  • 不支援策略替代方案:忽略 <wsp:ExactlyOne> 中除第一個外的所有選項。
  • 服務端全請求/回應開銷:即使僅對單向訊息應用安全,Rampart 仍處理雙向。
  • 客戶端全有或全無:啟用 Rampart 後所有操作承擔開銷,即使無安全策略。
  • 複雜組合易出錯:如同時對輸入簽名、輸出 UsernameToken 等非典型組合常報錯。

總結

將 WS-SecurityPolicy 內嵌 WSDL 並按操作/訊息引用,是實現細粒度安全的標準路徑。Axis2/Rampart 提供了初步支援,足以覆蓋常見用例,但企業級生產環境需評估其限制。後續文章將探討其他框架 (如 Metro/CXF) 的 WS-Security 實現與性能表現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved