我在WSO2 ESB中創建了代理服務並設置了UsernameToken身份驗證。然而,看起來使用JDK中捆綁的JAX-WS來配置UsernameToken並不容易(如描述here所述),JDK必須進行修補等等。有沒有一種方法可以像使用UsernameToken一樣使用基本HTTP身份驗證和ESB的憑據?基本身份驗證代替WSO2 ESB中的代理服務器的UsernameToken
回答
根據Amila Suriarachchi的文章"Securing Web Service Integration"「WSO2 carbon支持UT,即使通過轉換POX消息來進行HTTP基本認證」,但我不確定這是否與您的興趣相關。
但是,使用JAX-WS客戶端配置UsernameToken授權並不像看起來那麼困難。您所要做的就是創建一個實現javax.xml.ws.handler.soap.SOAPHandler的類,並通過覆蓋handleMessage(SOAPMessageContext messageContext)方法在出站消息中添加安全頭。
我的Java版本是1.6.0_26(沒有應用上述補丁),Web服務客戶端存根類由JAX-WS RI 2.1.7根據Web服務的wsdl生成,由UsernameToken場景,並由WSO2 Carbon服務器(即Data Services Server-2.6.3)公開
我使用Apache WSS4J創建安全頭 - 在這種情況下,只需實例化org.apache.ws.security.message.WSSecUsernameToken對象並通過setUserInfo(String user,String password)方法設置用戶名和密碼。此外,還應將時間戳記元素添加到傳出SOAP消息的安全性標頭中。 示例實現看起來是這樣的:
public boolean handleMessage(SOAPMessageContext messageContext) {
Boolean isOutboundMessage = (Boolean) messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (isOutboundMessage) {
SOAPPart messageSoapPart = messageContext.getMessage().getSOAPPart();
WSSecHeader securityHeader = new WSSecHeader();
securityHeader.insertSecurityHeader(messageSoapPart);
WSSecUsernameToken usernameToken = new WSSecUsernameToken();
usernameToken.setPasswordType(WSConstants.PASSWORD_TEXT);
usernameToken.setUserInfo("root", "top_secret");
WSSecTimestamp timestamp = new WSSecTimestamp();
usernameToken.build(messageSoapPart, securityHeader);
timestamp.build(messageSoapPart, securityHeader);
}
return true;
}
提到另一個重要的事情是,SOAP頭元素可能附帶的mustUnderstand全球SOAP屬性。參考Jim White撰寫的文章Working with Headers in JAX-WS SOAPHandlers,該屬性用於指示Web服務接收器或中介是否需要在處理消息之前理解標題元素。
如果mustUnderstand元素設置爲true(soapenv:mustUnderstand =「1」),則應對getHeaders()方法進行編碼,以告知運行時環境SOAP處理程序將負責處理mustUnderstand頭元素返回一組匹配mustUnderstand頭元素的QName(限定名稱)對象。以下是處理安全性標頭的getHeaders()方法。
public Set<QName> getHeaders() {
final String NAMESPACE_URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
final String LOCAL_PART = "Security";
final String PREFIX = "wsse";
final QName wssecurity = new QName(NAMESPACE_URI, LOCAL_PART, PREFIX);
final Set<QName> headers = new HashSet<QName>();
headers.add(wssecurity);
return headers;
}
最後,得到了服務端口,並調用它的任何方法要註冊上述類的一個實例之前(比方說 - UsernameTokenSecuritySoapHandler)到您的Web服務客戶端的處理程序鏈。這可以通過使用下面的代碼來完成:
Service service = new Service();
service.setHandlerResolver(new HandlerResolver() {
public List<Handler> getHandlerChain(PortInfo portInfo) {
List<Handler> handlers = new ArrayList<Handler>();
handlers.add(new UsernameTokenSecuritySoapHandler());
return handlers;
}
});
另外 - 你會發現here由小楊對JAX-WS API的處理程序框架的優秀文章。
希望這會有所幫助。
- 1. WSO2 ESB:對代理服務使用基本身份驗證
- 2. WSO2身份服務器身份驗證
- 3. WSO2 ESB身份驗證
- 4. 如何使用基本身份驗證創建esb代理
- 5. WSO2 ESB代理服務WSDL
- 6. NodeJs HTTP代理基本身份驗證
- 7. 使用代理服務器的Java中的HTTP基本身份驗證
- 8. WSO2 ESB中的條帶代理服務
- 9. WSO2 ESB代理服務版本
- 10. WSO2身份驗證服務器崩潰
- 11. WSO2身份服務器整合與ESB
- 12. 從請求基本身份驗證的代理服務器通信到webservice
- 13. 網絡代理服務器中的XACML身份驗證
- 14. Python中的HTTP代理服務器(帶身份驗證)
- 15. Web服務的基本身份驗證
- 16. 用於WSO2 ESB代理服務的WSDL
- 17. Windows上的WSO2 ESB代理服務
- 18. 使用基本身份驗證和代理身份驗證的駱駝Http
- 19. 同一服務器上的WSO2身份服務器和ESB
- 20. WSO2 ESB 4.5.0,身份驗證問題
- 21. 通過代理與Windows(NTLM)身份驗證的基本身份驗證訪問Web服務
- 22. 代理服務器後面的安全表單身份驗證
- 23. 代理服務器上的JAX-WS客戶端身份驗證
- 24. Axis2的NTLM身份驗證代理服務器
- 25. 使用httplib2處理身份驗證和代理服務器
- 26. 如何在代理服務器中實現身份驗證
- 27. WSO2身份服務器身份驗證與會話ID
- 28. WSO2身份服務器定製身份驗證上下文類
- 29. wso2身份服務器多因素身份驗證錯誤
- 30. WSO2 ESB在數據庫服務器中保存代理服務