2009-10-23 54 views
19

我是JAX-WS的新手,有一件我不明白的東西。JAX-WS和BASIC認證,當用戶名和密碼在數據庫中

關於如何設置JAX-WS安全性有很多教程,但在幾乎所有情況下,BindingProvider.USERNAME_PROPERTY和BindingProvider.PASSWORD_PROPERTY存儲在一些.xml文件中(取決於我認爲的容器) - 它們是「硬編碼」的。這就是我沒有得到的。如何通過將BindingProvider.USERNAME_PROPERTY和BindingProvider.PASSWORD_PROPERTY與數據庫中的用戶名和密碼進行比較來驗證Web服務客戶端?我試圖在客戶端設置BindingProvider.USERNAME_PROPERTY和BindingProvider.PASSWORD_PROPERTY這樣的:

ShopingCartService scs = new ShopingCartService(wsdlURL, name); 
    ShopingCart sc = scs.getShopingCartPort(); 
    Map<String, Object> requestContext = ((BindingProvider)sc).getRequestContext(); 
    requestContext.put(BindingProvider.USERNAME_PROPERTY, userName); 
    requestContext.put(BindingProvider.PASSWORD_PROPERTY, password); 
    sc.someFunctionCall(); 

,然後在服務器端獲取這樣的:

@Resource 
WebServiceContext wsContext; 

@WebMethod 
public void someFunctionCall() { 
    MessageContext mc = wsContext.getMessageContext(); 
    mc.get(BindingProvider.USERNAME_PROPERTY); 
    mc.get(BindingProvider.PASSWORD_PROPERTY); 
} 

但我總是空的,我沒「T成立於XML什麼,web服務工作得很好,但我不能讓這些變量:(

我在Java 1.6的,Tomcat的6和JAX-WS同時運行。

感謝您使用密碼從數據庫驗證用戶的任何幫助,非常感謝, 謝謝。

+0

我也試過在一種SOAPHandler檢查BindingProvider.USERNAME_PROPERTY,仍然無效。 – ahoge 2009-10-23 12:50:28

回答

12

BindingProvider.USERNAME_PROPERTY和BindingProvider.PASSWORD_PROPERTY匹配HTTP基本身份驗證機制,該機制可在HTTP級別啓用身份驗證進程,而不是在應用程序或servlet級別進行身份驗證。

基本上,只有HTTP服務器會知道用戶名和密碼(並且最終根據HTTP /應用服務器規範應用,例如Apache/PHP)。 使用Tomcat/Java,在web.xml中添加一個登錄配置BASIC,並添加適當的安全約束/安全角色(稍後將與用戶/實際用戶組關聯的角色)。

<login-config> 
    <auth-method>BASIC</auth-method> 
    <realm-name>YourRealm</realm-name> 
</login-config> 

然後,將HTTP服務器(或應用程序服務器)級別的領域連接到相應的用戶存儲庫。對於tomcat,您可以查看適合您需求的JAASRealm,JDBCRealm或DataSourceRealm。

http://tomcat.apache.org/tomcat-6.0-doc/realm-howto.html

19

我認爲你是在應用層面尋找JAX-WS認證,在服務器級別不是HTTP基本。請參見下面的完整的例子:

Application Authentication with JAX-WS

在Web服務客戶端的網站,只要把你的「用戶名」和「密碼」爲請求頭。

Map<String, Object> req_ctx = ((BindingProvider)port).getRequestContext(); 
req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WS_URL); 

Map<String, List<String>> headers = new HashMap<String, List<String>>(); 
headers.put("Username", Collections.singletonList("someUser")); 
headers.put("Password", Collections.singletonList("somePass")); 
req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers); 

在Web服務服務器站點上,通過WebServiceContext獲取請求標頭參數。

@Resource 
WebServiceContext wsctx; 

@WebMethod 
public String method() { 
    MessageContext mctx = wsctx.getMessageContext(); 

    Map http_headers = (Map) mctx.get(MessageContext.HTTP_REQUEST_HEADERS); 
    List userList = (List) http_headers.get("Username"); 
    List passList = (List) http_headers.get("Password"); 
    //... 
+0

請問你從哪裏得到這些信息?我需要官方的信息來源,但我找不到任何有足夠信息的官方消息來源! – 2013-08-28 13:09:36

+3

這裏給出的例子設計得很差,非常不安全。你永遠不應該在家中烘烤安全解決方案。該示例還通過不安全的http傳輸用戶名和密碼。如果有人在聽網絡,很容易接聽。 它也很容易配置基本身份驗證(請參閱雪花的答案),並通過https使用它。這至少是一個體面的解決方案,不需要容易出錯的編程 - 密碼在未受保護的網絡上是安全的。 – 2015-11-04 20:48:48

1

我是面對類似的情況,我需要提供給我的WS:用戶名,密碼和WSS密碼類型。

我最初使用「Http Basic Auth」(作爲@ahoge),我試圖使用@ Philipp-Dev的參考。太。我沒有得到成功的解決方案。

在谷歌略深的搜索後,我發現這個職位:

https://stackoverflow.com/a/3117841/1223901

而且有我的問題解決

我希望這可以幫助別人,就像幫助我。

RGDS, iVieL