用户名和密码位于数据库中时的JAX-WS和BASIC身份validation

我是JAX-WS的新手,有一件事我不明白。

有很多关于如何设置JAX-WS安全性的教程,但几乎所有情况下BindingProvider.USERNAME_PROPERTY和BindingProvider.PASSWORD_PROPERTY都存储在一些.xml文件中(取决于我认为的容器) – 它们是“硬编码的”那是。 这就是我没有得到的。 如何通过将BindingProvider.USERNAME_PROPERTY和BindingProvider.PASSWORD_PROPERTY与数据库中的用户名和密码进行比较来validationWeb服务客户端? 我尝试在客户端设置BindingProvider.USERNAME_PROPERTY和BindingProvider.PASSWORD_PROPERTY,如下所示:

ShopingCartService scs = new ShopingCartService(wsdlURL, name); ShopingCart sc = scs.getShopingCartPort(); Map 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); } 

但我总是得到null,我没有在xml中设置任何东西,web服务工作得很好,除了我不能得到那些变量:(

我在java 1.6,tomcat 6和JAX-WS上运行 。

任何有关使用数据库密码validation用户的帮助都非常感谢,谢谢。

我认为您正在寻找应用程序级别的JAX-WS身份validation,而不是服务器级别的HTTP基础。 请参阅以下完整示例:

使用JAX-WS进行应用程序身份validation

在Web服务客户端站点上,只需将“用户名”和“密码”放入请求标头中。

 Map req_ctx = ((BindingProvider)port).getRequestContext(); req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WS_URL); Map> headers = new HashMap>(); 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"); //... 

BindingProvider.USERNAME_PROPERTY和BindingProvider.PASSWORD_PROPERTY匹配HTTP基本身份validation机制,该机制在HTTP级别而不是在应用程序或servlet级别启用身份validation过程。

基本上,只有HTTP服务器才能知道用户名和密码(最终根据HTTP /应用服务器规范知道应用程序,例如Apache / PHP)。 使用Tomcat / Java,在web.xml中添加登录配置BASIC和相应的安全约束/安全角色(稍后将与用户/真实用户组关联的角色)。

  BASIC YourRealm  

然后,将HTTP服务器(或应用程序服务器)级别的域与相应的用户存储库连接。 对于tomcat,您可以查看适合您需求的JAASRealm,JDBCRealm或DataSourceRealm。

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

我遇到了同样的问题,在这里找到了解决方案:

http://www.mastertheboss.com/web-interfaces/336-jax-ws-basic-authentication.html?start=1

祝好运

对于使用两者的示例,应用程序级别的身份validation和HTTP基本身份validation请参阅我以前的一篇post 。

我面对类似的情况,我需要提供给我的WS:用户名,密码和WSS密码类型。

我最初使用的是“Http Basic Auth”(作为@ahoge),我试图使用@ Philipp-Dev的参考。 太。 我没有得到成功的解决方案。

在谷歌搜索了一下之后,我发现了这篇文章:

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

还有我的问题解决方案

我希望这可以帮助其他任何人,比如帮助我。

Rgds,iVieL

在您的客户端SOAP处理程序中,您需要设置javax.xml.ws.security.auth.username和javax.xml.ws.security.auth.password属性,如下所示:

 public class ClientHandler implements SOAPHandler{ public boolean handleMessage(final SOAPMessageContext soapMessageContext) { final Boolean outInd = (Boolean)soapMessageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (outInd.booleanValue()) { try { soapMessageContext.put("javax.xml.ws.security.auth.username", ); soapMessageContext.put("javax.xml.ws.security.auth.password", ); } catch (Exception e) { e.printStackTrace(); return false; } } return true; } }