0

大家好,我正在阅读有关使用 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 服务的功能),因此除非通过身份验证客户端将无法访问 Web 服务方法。

2)我看到的另一种方法可能是单向客户端 SSL?(配置传输级安全性

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

对于更多背景知识,我有一个 Web 服务(jax-ws),它具有使用 JPA 作为数据库管理器/持久化器来查询 db 等的方法。我的客户端将与 Swing UI 交互并连接到 Web 服务。

4

1 回答 1

1

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

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

要开始配置此安全性,请参阅本教程。

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

于 2013-07-24T13:26:11.787 回答