使用JAX-WS进行客户端应用程序验证

时间:2013-07-24 07:43:31

标签: java authentication jpa jax-ws

大家好我正在阅读Application Authentication with JAX-WS的教程,简而言之,归结为:

@Override
public String getHelloWorldAsString() {

MessageContext mctx = wsctx.getMessageContext();

//get detail from request headers
    Map http_headers = (Map) mctx.get(MessageContext.HTTP_REQUEST_HEADERS);
    List userList = (List) http_headers.get("Username");
    List passList = (List) http_headers.get("Password");

    String username = "";
    String password = "";

    if(userList!=null){
        //get username
        username = userList.get(0).toString();
    }

    if(passList!=null){
        //get password
        password = passList.get(0).toString();
    }

    //Should validate username and password with database
    if (username.equals("mkyong") && password.equals("password")){
        return "Hello World JAX-WS - Valid User!";
    }else{
        return "Unknown User!";
    }

}   

正如您所看到的,该方法会检查身份验证并返回结果,但这意味着我的所有Web服务方法都需要检查身份验证。

所以基本上我想知道如何让授权只发生一次? (当客户登录时)。

我有一些简单的想法:

1)使Web服务仅允许单个login()方法,如果登录错误将返回null或具有所有其他方法的另一个类的对象实例(即组成因此,除非通过身份验证,否则客户端将无法访问Web服务方法。

2)我看到的另一种方法可能是单向客户端SSL? (Configuring Transport-Level Security

这是应该怎么做还是我错过了什么?

对于更多的背景我有一个Web服务(jax-ws),它有使用JPA作为databasemanager / persistor查询db等的方法。我的客户端将与Swing UI连接并连接到Web服务。

1 个答案:

答案 0 :(得分:1)

每个Web服务调用都需要进行某种类型的身份验证,无论是通过用户名和密码,证书还是某种类型的令牌(之前通过调用“登录”操作发出的)。

如果您真正想做的就是从Web服务中获取身份验证代码,最简单(也更安全)的解决方案通常是让J2EE容器通过SSL / TLS和基本身份验证处理身份验证和授权(和您的客户端会在每次调用时发送用户名和密码,如#2)选项。

开始配置此安全性see this tutorial.

要查看的具体内容包括<auth-method>BASIC</auth-method><transport-guarantee>CONFIDENTIAL</transport-guarantee><web-resource-collection>配置。