大家好我正在阅读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服务。
答案 0 :(得分:1)
每个Web服务调用都需要进行某种类型的身份验证,无论是通过用户名和密码,证书还是某种类型的令牌(之前通过调用“登录”操作发出的)。
如果您真正想做的就是从Web服务中获取身份验证代码,最简单(也更安全)的解决方案通常是让J2EE容器通过SSL / TLS和基本身份验证处理身份验证和授权(和您的客户端会在每次调用时发送用户名和密码,如#2)选项。
开始配置此安全性see this tutorial.
要查看的具体内容包括<auth-method>BASIC</auth-method>
,<transport-guarantee>CONFIDENTIAL</transport-guarantee>
和<web-resource-collection>
配置。