2016-03-21 57 views
1

我需要使用apache WSS4J 1.5進行一些SOAP簽名/驗證,但是我無法跳過/禁用UsernameToken密碼驗證。WSS4j 1.5:如何跳過密碼驗證?

在WSS4J 1.6+中,我能夠將安全引擎配置爲使用NoOpValidator()類跳過用戶名令牌認證,但1.5不具備此支持。

有什麼辦法可以告訴WSS4J 1.5完全跳過用戶名/密碼驗證路由嗎?

回答

0

更深入一點在WSSecEngine類周圍挖掘後,我發現我需要的不是一個的CallBackHandler,但跳過處理的定製處理器的UsernameToken對象:

 WSSecurityEngine secEngine = new WSSecurityEngine(); 
     WSSConfig wsConfig = WSSConfig.newInstance(); 
     wsConfig.setProcessor(UsernameToken.TOKEN, new Processor() { 

      @Override 
      public void handleToken(Element arg0, Crypto arg1, Crypto arg2, CallbackHandler arg3, WSDocInfo arg4, Vector arg5, WSSConfig arg6) 
        throws WSSecurityException { 
       // skip the token processing 
       logger.debug("Skipping processing of the username token"); 
      } 

      @Override 
      public String getId() { 
       return null; 
      } 
     }); 
     secEngine.setWssConfig(wsConfig); 

雖然WSS4J 1.5是非常古老的,但希望這可能會希望別人在未來。

WSS4J 1.6+改變了這些處理器使用Validator的方式。

1

您需要編寫自己的回調處理程序實現以跳過加載LoginContext。然後可以從系統屬性加載處理程序類。

從javax.security.auth.callback.CallbackHandler的的源代碼指,

默認的CallbackHandler類實現可以在 auth.login.defaultCallbackHandler安全屬性來指定。

可以在位於名爲/lib/security/java.security的文件中的Java安全屬性文件 中設置安全屬性。 引用java.home系統屬性的值,並且 指定安裝JRE的目錄。

如果安全屬性設置爲一個 CallbackHandler實現類的完全合格的名稱,然後一個LoginContext將加載 指定CallbackHandler,並將它傳遞給底層 的LoginModule。

如果LoginContext沒有提供 之一,則它只加載默認處理程序。所有默認的處理程序實現都必須提供一個公共的 零參數構造函數。

另外要注意的一些風險,自帶WSS4J 1.5.XX

+0

我仍然有點困惑如何註冊回調處理程序。我查看了'UsernameTokenProcessor'的源代碼,但是當它在這裏查看回調處理程序時,它已經在比較返回的密碼。我需要阻止WSS4J甚至試圖處理UsernameToken,但我不完全確定回調處理程序應該是什麼或應該如何註冊。你知道這是否有任何文檔/例子嗎?我意識到WSS4J 1.5已經很老了,我所能找到的所有文檔都是針對WSS4J 2+的。 –

+0

好的 - 所以我在代碼中多挖一下,看到它不是我需要的CallbackHandler,而是一個定製處理器。 –