2009-10-23 59 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