JAX-WS 和基本认证,当用户名和密码位于数据库中时

2022-09-01 20:36:47

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

关于如何设置 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);
}

但是我总是得到空值,我没有在xml中设置任何东西,Web服务工作得很好,除了我无法将这些变量:(

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

非常感谢任何有关使用数据库中的密码对用户进行身份验证的帮助,谢谢。


答案 1

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

使用 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");
    //...

答案 2

BindingProvider.USERNAME_PROPERTY和BindingProvider.PASSWORD_PROPERTY与 HTTP 基本身份验证机制相匹配,这些机制在 HTTP 级别启用身份验证过程,而不是在应用程序或 servlet 级别启用身份验证过程。

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

<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


推荐